Schnellste Möglichkeit, geschachtelte Masseneinfügungen mit scope_identity () durchzuführen?

In einer unserer (C #) Anwendungen wird ein großes Diagramm eingefügt / aktualisiert (Hunderte von Einfügungen und Aktualisierungen). Dies ist in eine Transaktion eingebunden, da ich im Fehlerfall ein Rollback der gesamten Sache durchführen muss. Wir benutzen Dapper, um die SQL-Anweisungen auszuführen.

Leider dauert der gesamte Vorgang derzeit zwischen 2 und 8 Sekunden. Das sind 2 bis 8 Sekunden, in denen die Kerntabellen in unserer Datenbank gesperrt sind und andere Anwendungen hängen bleiben oder unter den Sperren leiden.

ch habe festgestellt, dass einer der Vorgänge, der in eine Tabelle mit über 120 Millionen Datensätzen eingefügt wird, die meiste Zeit in Anspruch nimmt, bin mir jedoch nicht sicher, wie ich diesen Vorgang optimieren kan

rob gesagt ist dieses Tabellendiagramm wie folgt aufgebaut:

table A (
  id int primary_key,
  name nvarchar
)

table B (
    id int primary_key,
    a_id int foreign_key, # has an index
    name nvarchar
)

Wenn Daten in @ eingefügt werdA Ich muss auch entsprechende Daten in @ einfügB. Also benutze ichscope_identity(), um die ID des Datensatzes abzurufen und beim Einfügen von Datensätzen in @ zu verwendeB.

Pseudo-weise sieht das so aus:

# open transaction
# perform other table inserts
#
# this is one of the slowest operations
for item in list_a
    id_a = exec "insert into A (name) values (" + item.name + "); select scope_identity() as int"

    for bar in item.list_b
        exec "insert into B (id_a, name) values (" + id_a + ", " + bar.name + ")"
#
# perform more operations
# commit transaction

Wenn Sie dies googeln, besteht eine der Lösungen darin, dies in eine Transaktion zu packen. Ich weiß jedoch nicht, wie hoch die Leistung sein würde, da dies bereits in der übergeordneten Transaktion enthalten ist. Würde es das Problem lösen?

Eine zweite Lösung besteht darin, die Datensätze mit einem @ einzufügeunion all select..., aber ich weiß nicht, ob ich das @ verwenden könnscope_identity() in diesem Aufruf.

Wie kann ich diesen speziellen Fall verbessern? Was kann ich noch tun, um den Vorgang zu beschleunigen oder um zu verhindern, dass andere Anwendungen unter diesen Sperren leiden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage