Bericht aus der Praxis:
Daten von einem MS SQL Server (Version 2008) sollen auf eine PostgreSQL Datenbank übertragen werden. Ein Programm liest alle Zeilen einer Tabelle von der einen DB und schreibt sie in eine Tabelle der anderen. Dabei treten keine Fehler auf. Zur Überprüfung führt das Programm auf beiden DBs ein "SELECT COUNT(*) FROM tabelle" auf und vergleicht die beiden Zahlen.
Beim MS SQL Server ist die Anzahl höher, weshalb das Programm die Übertragung als misslungen betrachtet.
Nach längerem fand ich die Ursache. Der MS SQL Server liefert beim COUNT(*) eine Zahl, die höher ist als die tatsächliche Anzahl der Zeilen in der Tabelle. Das liegt daran, dass hierzu der PRIMARY KEY Index verwendet ist.
Füge ich einen weiteren (völlig redundanten) Index hinzu, stimmt die Anzahl. Lösche ich diesen Index wieder, ist das Ergebnis wieder zu hoch.
Ein REBUILD auf den Index korrigiert das Ergebnis leider nicht. Löschen und neu erzeugen ist notwendig.
Im Ergebnis: Der Index ist korrupt, MS SQL Server hat dies nicht bemerkt.
Hätte das Programm beim Lesen einen Zähler mitlaufen lassen, anstatt anschließend ein COUNT(*) durchzuführen, wäre auch alles glatt gegangen.
Beim MS SQL Server kann man Indexen offensichtlich nicht trauen. Ein Neu-Aufbauen von Indexen ist laut Auskunft von Leuten, die mit ihm vertraut sind, regelmäßig anzuraten.
Es bleibt zu hoffen, dass dieses Problem bei aktuelleren Versionen nicht mehr auftritt.