SQL Server-Einfügeleistung

Ich habe eine Einfügeabfrage, die so generiert wird

INSERT INTO InvoiceDetail (LegacyId,InvoiceId,DetailTypeId,Fee,FeeTax,Investigatorid,SalespersonId,CreateDate,CreatedById,IsChargeBack,Expense,RepoAgentId,PayeeName,ExpensePaymentId,AdjustDetailId) 
VALUES(1,1,2,1500.0000,0.0000,163,1002,'11/30/2001 12:00:00 AM',1116,0,550.0000,850,NULL,@ExpensePay1,NULL); 
DECLARE @InvDetail1 INT; SET @InvDetail1 = (SELECT @@IDENTITY);

Diese Abfrage wird nur für 110 KB-Zeilen generiert.

Es dauert 30 Minuten, bis alle diese Abfragen ausgeführt sind

Ich habe den Abfrageplan überprüft und die größten% -Knoten sind

Eine Clustered-Index-Einfügung mit 57% Abfragekosten, die eine lange XML-Datei enthält, die ich nicht veröffentlichen möchte.

Ein Tabellenspool mit 38% Abfragekosten

<RelOp AvgRowSize="35" EstimateCPU="5.01038E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Eager Spool" NodeId="80" Parallel="false" PhysicalOp="Table Spool" EstimatedTotalSubtreeCost="0.0466109">
  <OutputList>
    <ColumnReference Database="[SkipPro]" Schema="[dbo]" Table="[InvoiceDetail]" Column="InvoiceId" />
    <ColumnReference Database="[SkipPro]" Schema="[dbo]" Table="[InvoiceDetail]" Column="InvestigatorId" />
    <ColumnReference Column="Expr1054" />
    <ColumnReference Column="Expr1055" />
  </OutputList>
  <Spool PrimaryNodeId="3" />
</RelOp>

Meine Frage ist also, was kann ich tun, um die Geschwindigkeit dieser Sache zu verbessern? Ich habe bereits ALTER TABLE TABLENAME NOCHECK CONSTRAINTS ALL vor den Abfragen ausgeführt und ALTER TABLE TABLENAME NOCHECK CONSTRAINTS ALL nach den Abfragen.

Und das hat kaum etwas von der Zeit abgezogen.

Wissen Sie, ich führe diese Abfragen in einer .NET-Anwendung aus, die ein SqlCommand-Objekt zum Senden der Abfrage verwendet.

Ich habe dann versucht, die sql-Befehle in eine Datei auszugeben und sie dann mit sqlcmd auszuführen, aber ich habe keine Updates dazu erhalten, also habe ich darauf verzichtet.

Irgendwelche Ideen oder Hinweise oder Hilfe?

AKTUALISIEREN:

Ok, ihr alle wart sehr hilfreich. In dieser Situation wünschte ich, ich könnte mehr als eine Antwort würdigen.

Die Lösung, um dies zu beheben, war zweifach.

Der Erste:

1) Ich habe alle Fremdschlüssel deaktiviert / wieder aktiviert (viel einfacher als sie zu löschen)

ALTER TABLE TableName NOCHECK CONSTRAINT ALL
ALTER TABLE TableName CHECK CONSTRAINT ALL

2) Ich habe die Indizes deaktiviert / wieder aktiviert (wieder viel einfacher als das Löschen)

ALTER INDEX [IX_InvoiceDetail_1] ON [dbo].[InvoiceDetail] DISABLE
ALTER INDEX [IX_InvoiceDetail_1] ON [dbo].[InvoiceDetail] REBUILD PARTITION = ALL WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, ONLINE = OFF, SORT_IN_TEMPDB = OFF )

Der Zweite:

Ich habe alle Einfügeanweisungen in einer Transaktion zusammengefasst. Ich wusste anfangs nicht, wie man das in .NET macht.

Ich schätze den ganzen Input sehr.

Wenn ich jemals eine solche Übersetzung von DB zu DB mache, fange ich definitiv mit BULK INSERT an. Es scheint viel flexibler und schneller zu sein.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage