2017-09-28 5 views
0

Ich habe zwei Anwendungen, die etwas mit der gleichen SQL Server-Tabelle tun. Eine Anwendung verwendet C# SqlBulkCopy, um etwa zweihunderttausend Datensätze in die SQL Server-Tabelle zu importieren, und die andere Anwendung fragt Daten aus derselben SQL Server-Tabelle ab.SQL Server ausgesetzt

Ich finde diese Nachricht - bitte überprüfen Sie den Screenshot. Die Tabelle hat hundert Millionen Zeilen. Wie kann ich es reparieren?

Please check this picture

+2

Wenn Ihre Anwendung # 1 200000 Zeilen in die Tabelle lädt, wird diese Tabelle für die Dauer des Ladevorgangs ** exklusiv gesperrt ** - Ihre Anwendung # 2 kann daher nicht um diese Tabelle abzufragen, ** bis der Ladevorgang abgeschlossen ist. ** –

+0

Also kann ich nichts tun? Ich denke SqlBulkCopy wait_time = 4314076 Millisekunden ist zu langsam. Ist es SqlBulkCopy Problem? –

Antwort

1

Wenn eine Transaktion eine Tabelle modifiziert und beeinflusst mehr als 5000 Zeilen, dann wird SQL Server die Verriegelung von Sperren auf Zeilenebene zu einer exklusiven Tabellensperre eskalieren.

Wenn also Ihre Anwendung # 1 200000 Zeilen in die Tabelle lädt, wird diese Tabelle für die Dauer des Ladevorgangs exklusiv gesperrt.

Daher kann Ihre Anwendung # 2 - oder jeder andere Client - diese Tabelle nicht abfragen, bis der Ladevorgang abgeschlossen ist.

Dies ist normal, dokumentiert, erwartetes Verhalten seitens SQL Server.

Stellen Sie sicher, dass Sie Ihre Daten während der Geschäftszeiten in Stapeln mit weniger als 5000 Zeilen gleichzeitig laden, oder führen Sie das Laden nach Stunden durch, wenn niemand durch eine exklusive Tabellensperre beeinträchtigt wird.

+0

Würde ein 'NOLOCK'-Hinweis in diesem Fall hilfreich sein? – Nisarg

+0

@NisargShah: Ich denke nicht, da die ganze Tabelle exklusiv gesperrt ist –