Nachdem ich ein SSIS-Paket überprüft hatte (da ein SQL Server Befehle sehr langsam ausführte), das in einem unserer Clients etwa 5 bis 4 Jahre vor dem Zeitpunkt eingerichtet wurde, als ich dies schrieb, stellte ich fest, dass die folgenden Aufgaben vorhanden waren: 1 ) Daten aus einer XML-Datei in eine Tabelle namens [Importbarcdes] einfügen.
2) Zusammenführungsbefehl für eine andere Zieltabelle unter Verwendung der oben genannten Tabelle als Quelle.
3) "Aus [Importbarcodes] löschen", um die Tabelle der Zeile zu löschen, die eingefügt wurde, nachdem die XML-Datei von der Aufgabe des SSIS-Pakets gelesen wurde.
Nach einer kurzen Überprüfung dauerte die Ausführung aller Anweisungen (SELECT, UPDATE, DELETE usw.) in der Tabelle ImportBarcodes, die nur eine Zeile enthielten, ca. 2 Minuten.
Erweiterte Ereignisse zeigten eine ganze Menge PAGEIOLATCH_EX-Wartebenachrichtigungen.
In der Tabelle waren keine Indizes vorhanden und es wurden keine Trigger registriert.
Bei genauer Betrachtung der Eigenschaften der Tabelle auf der Registerkarte "Speicher" und im Abschnitt "Allgemein" wurden im Feld "Datenbereich" mehr als 6 GIGABYTES Speicherplatz angezeigt, der auf Seiten zugewiesen wurde.
Was ist passiert:
Die Abfrage wurde in den letzten 4 Jahren jeden Tag über einen guten Teil der Zeit ausgeführt, wobei Daten in die Tabelle eingefügt und gelöscht wurden, wobei nicht verwendete Auslagerungsdateien zurückblieben, ohne sie freizugeben.
Dies war der Hauptgrund für die Warteereignisse, die von der erweiterten Ereignissitzung erfasst wurden, und für die langsam ausgeführten Befehle auf dem Tisch.
Durch Ausführen wurde ALTER TABLE ImportBarcodes REBUILD
das Problem behoben, durch das der gesamte nicht verwendete Speicherplatz freigegeben wurde. TRUNCATE TABLE ImportBarcodes
hat etwas Ähnliches getan, mit dem einzigen Unterschied, dass alle Auslagerungsdateien und Daten gelöscht wurden.
where [col] = '1'
?