Производительность вставки SQL Server

У меня есть запрос вставки, который генерируется так

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);

Этот запрос генерируется только для 110К строк.

Выполнение всех этих запросов занимает 30 минут

Я проверил план запроса и самые большие% узлов

Вставка кластерного индекса при 57% стоимости запроса с длинным XML, который я не хочу публиковать.

Таблица Spool, которая составляет 38% стоимости запроса

<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>

Итак, мой вопрос: что я могу сделать, чтобы улучшить скорость этой вещи? Я уже запускаю ALTER TABLE TABLENAME NOCHECK, СОДЕРЖАЩИЙ ВСЕ перед запросами, а затем ALTER TABLE TABLENAME NOCHECK, СОДЕРЖАЩИЙ ВСЕ после запросов.

И это ничего не сбрило от времени.

Знайте, что я выполняю эти запросы в приложении .NET, которое использует объект SqlCommand для отправки запроса.

Затем я попытался вывести команды sql в файл, а затем выполнить его с помощью sqlcmd, но я не получил никаких обновлений о том, как это происходит, поэтому я отказался от этого.

Любые идеи или намеки или помощь?

ОБНОВИТЬ:

Хорошо, так что вы все были очень полезны. В этой ситуации хотелось бы отдать должное более чем одному ответу.

Решение этой проблемы было двояким.

Первый:

1) Я отключил / включил все внешние ключи (гораздо проще, чем их сбросить)

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

2) Я отключил / снова включил индексы (опять же намного проще, чем сбросить)

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 )

Второй:

Я обернул все операторы вставки в одну транзакцию. Я изначально не знал, как это сделать в .NET.

Я действительно ценю весь вклад, который я получил.

Если я когда-либо сделаю такой перевод из БД в БД, я обязательно начну с BULK INSERT. Кажется, намного гибче и быстрее.

Ответы на вопрос(8)

Ваш ответ на вопрос