BCP stoppt nach den letzten 1000 Zeilen, die an SQL Server gesendet wurden. Insgesamt gesendet:… ”

7

Ich habe das Massenkopierprogramm BCP von SQL Server 2005 folgendermaßen ausgeführt:

bcp mydb.dbo.mytbl in myfile.blk -c -S mysvr -U mylogin -P mypass

Und es lief und produzierte Ausgabe wie folgt:

Starting copy...
1000 rows sent to SQL Server. Total sent: 1000
...
1000 rows sent to SQL Server. Total sent: 55000

Aber dann hörte es auf. Der Cursor kehrte nicht zur Eingabeaufforderung zurück. Ich habe die "... kopierten Zeilen" nicht erhalten. Botschaft.

Ich habe versucht, die Zieltabelle abzufragen, und ich kann bereits die Zeilen sehen, die ich importieren wollte.

Soll ich die Konsole beenden? Wird es zurückrollen?

Endy Tjahjono
quelle

Antworten:

2

Der Prozess scheint zu hängen, da er zwar alle Daten an SQL Server gesendet hat, die Daten jedoch nur in Sortierpuffern abgelegt wurden - er hat die Zieltabelle noch nicht erreicht.

Wenn die Tabelle Indizes enthält, sortiert SQL Server die Daten vor dem Einfügen in die erforderliche Indexreihenfolge. Wenn der Datensatz groß ist, viele Indizes vorhanden sind oder in SQL Server nicht genügend Sortierspeicher verfügbar ist, kann dieser Vorgang viel Zeit in Anspruch nehmen. Das Vorhandensein von Indizes und vorhandenen Tabellendaten kann sich auch auf die Fähigkeit von SQL Server auswirken, optimierte, minimal protokollierte Einfügungen zu verwenden.

Ohne minimal protokollierte Einfügungen ist der Einfügevorgang (nach dem Sortieren) ebenfalls langsam, da jede Zeile vollständig im Transaktionsprotokoll aufgezeichnet ist (einschließlich der Informationen, die zum Rückgängigmachen der Einfügung erforderlich sind, um die Wiederherstellbarkeit sicherzustellen).

Es können mehrere bcp-Optionen angegeben werden, um minimal protokollierte Einfügungen zu erzielen. Möglicherweise sind auch andere Maßnahmen erforderlich, z. B. das vorübergehende Ändern des Wiederherstellungsmodells der Datenbank, um effiziente Massenvorgänge zu unterstützen. Oft ist es auch die optimale Strategie, nicht gruppierte Indizes vor dem Einfügen zu löschen und anschließend neu zu erstellen.

Um die Hauptpunkte eines komplexen Themas zusammenzufassen:

  • Verwenden Sie ein Wiederherstellungsmodell, das minimal protokollierte Einfügungen unterstützt
  • Geben Sie einen TABLOCKHinweis an (die genaue Syntax variiert je nach Einfügemethode).
  • Geben Sie den ORDERHinweis an und stellen Sie sicher, dass die Datenquelle nach dem Clustering-Schlüssel vorsortiert ist
  • Deaktivieren Sie Trigger und Einschränkungen
  • Wenn möglich in eine leere Tabelle laden

Weitere Informationen finden Sie unter:

Optimieren der Leistung von Masseneinfügungen und verknüpften Seiten

Für SQL Server 2008 und höher:

Das Handbuch zum Laden von Daten

Paul White 9
quelle
2

Nach 3 Stunden bekam ich endlich meine Aufforderung zurück:

55837 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 10582641 Average : (5.28 rows per sec.)

Obwohl ich immer noch nicht weiß, warum es nicht sofort zurückgegeben wurde, da die Zeilen bereits eingefügt wurden. Meine beste Vermutung war, dass der Index neu erstellt wurde.

Ich werde versuchen, die Konsole zu beenden, wenn sie das nächste Mal so auflegt.

Endy Tjahjono
quelle