У меня есть запрос, который получает вставки сгенерированный как этотSQL производительность вставки сервера
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);
Этот запрос генерируется только для 110K строк.
Это займет 30 минут для всех этих запросов, чтобы выполнить
Я проверил план запроса и крупнейшие% узлы
индекса кластерных вставок на 57% запросы стоили , который имеет длинный XML, что Я не хочу публиковать сообщения.
A Таблица золотника, который является 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, но я не получал никаких обновлений о том, как это происходит, поэтому я отказался от этого.
Любые идеи или намеки или помощь?
UPDATE:
Ok так вы все были очень полезны. В этой ситуации мне хотелось бы дать ответ на более чем один ответ.
Решение исправить это было двояким.
Первые:
1) I-инвалидов/снова включить все внешние ключи (намного проще, чем сбросив их)
ALTER TABLE TableName NOCHECK CONSTRAINT ALL
ALTER TABLE TableName CHECK CONSTRAINT ALL
2) I-инвалидов/снова включить индексы (опять-таки гораздо проще, чем падение)
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. Это кажется намного более гибким и быстрым.
Расскажите нам о вашем кластерном индексе и вставки. Связана ли ваша вставка с вашим кластеризованным индексом, чтобы все записи были добавлены после существующих записей? (т. е. записи естественно последовательны для кластерного индекса) –
Никогда не используйте @@ Identity! С этим вы можете испортить целостность данных, поскольку оно не всегда возвращает правильное значение. Вместо этого используйте scope_Identity(). – HLGEM
Я знаю, что это уже давно, но помните, сколько времени занимали последние вопросы? Просто интересно, какая разница, все это сделано? –