Das Einfügen dauert mehr als 5 Stunden, wenn mehr als eine bestimmte Anzahl von Zeilen eingefügt wird

8

Wenn weniger als ungefähr 1.350.000 Zeilen in die Tabelle eingefügt werden, dauert alles ungefähr 2 Minuten. Wenn jedoch die Anzahl der eingefügten Zeilen größer ist, erhöht sich die zum Einfügen von Daten erforderliche Zeit auf ungefähr 5 Stunden.

Das Problem hängt nicht mit Abfragen oder Indizes zusammen, da seit langer Zeit alles einwandfrei funktioniert und sich an der Struktur von Abfragen, Tabellen oder Indizes nichts geändert hat.

Das Problem trat zum ersten Mal vor ungefähr 2 Wochen auf und tritt wiederholt an Tagen auf, an denen die Anzahl der eingefügten Zeilen größer als + -1.350.000 ist. Beispielsweise beträgt die Anzahl der eingefügten Zeilen an einem Tag 1.200.000 und der Vorgang dauert 2 Minuten. Am anderen Tag beträgt die Anzahl der Zeilen 1.450.000 und das Einfügen von Daten dauert 5 bis 6 Stunden.

Ich habe versucht, Indizes neu zu erstellen, aber es hat nicht geholfen.

Piotr
quelle
3
Was ist die Quelle für die Beilage?
Martin Smith
4
Können Sie nach , was das ist Wartezeit verbunden ist, wenn Einsatz ist eine so lange Zeit zu nehmen?
Kin Shah
4
Wir können nur raten, wenn Sie weitere Informationen geben. Ich vermute, dass eine Eskalation der Sperre stattfindet. Können Sie Wartezeiten aufspüren und Eskalation sperren
Shanky
1
Versuchen Sie zum ersten Mal, 1,3 Millionen Datensätze einzufügen? Machen Sie Transaktionen? Massenimport? Welche Art der Protokollierung machen Sie? Wenn Sie einfache Jane-Einfügungen machen, stimme ich zu, versuchen Sie, die Einfügungen in Stapeln zu machen.
SQLburn
2
Wie importieren Sie die Daten (bcp, Bulk Insert, SSIS, Batch-Datei)? Woher (lokaler Speicher, gleiches / unterschiedliches Laufwerk, Netzwerkspeicher, ..)? Was ist das Tabellenschema? Was ist der Importbefehl? Was ist der Ausführungsplan (wenn es sich um einfaches T-SQL handelt)?
Marian

Antworten:

14

Meine Vermutung wäre - wenn Sie nicht tatsächlich blockiert werden -, dass Sie einen Schwellenwert erreichen, über dem die Datendatei (und / oder Protokolldatei) wachsen muss, und dass Ihre Konfiguration nicht optimiert ist, um dieses Wachstum zu unterstützen. Sicher gehen, dass:

  1. Die Wachstumsrate Ihrer Datendatei ist angemessen und hat eine feste Größe (nicht%!), Die groß genug ist, um diese Transaktion und alles andere, was möglicherweise gleichzeitig stattfindet, aufzunehmen.
  2. Gleiches gilt für die Protokolldatei.
  3. Die sofortige Dateiinitialisierung ist aktiviert . Dies wird dazu beitragen, das Wachstum von Datendateien zu beschleunigen, nicht jedoch das oft problematischere Wachstum von Protokolldateien.
  4. Sie fügen nicht 1,35 Millionen einzelne Zeilen in eine Schleife oder auf andere Weise alle als eine große Transaktion ein. Es gibt etwas zu sagen, um Ihre Transaktionen in Stücke zu zerlegen .
Aaron Bertrand
quelle
1
Aaron ist genau richtig mit seinen Vorschlägen, die sich nach Filegrowth auf Daten oder Protokolldateien anhören. Stellen Sie außerdem sicher, dass die Anzahl der virtuellen Protokolldateien niedrig ist.
Namphibian
4

Könnte dies ein Speicherproblem sein?

Sie könnten diese Art von Verhalten beobachten, wenn ein Datenblock, auf den wiederholt zugegriffen werden muss, zu groß für den Speicher wird und Sie einen Festplatten-Thrash aus der Hölle bekommen. Wenn Sie einen Datenblock durchlaufen müssen, der zu groß für den Speicher ist, wird das Ganze bei jedem Durchgang aus der Auslagerungsdatei zurückgelesen. Wenn Sie diese Grenze überschreiten, kann Ihre Leistung von einer Klippe fallen.

Loren Pechtel
quelle
3

Versuchen Sie / ist es möglich, sie in kleinere Chargen aufzuteilen? Wenn ich auf ein ähnliches Problem gestoßen bin, hat die Gruppierung nach 5.000 (mit GO) die Zeit für die Ausführung einer solchen Aufgabe erheblich verkürzt.

Alex Szabó
quelle