удалить большое количество данных - PullRequest
2 голосов
/ 02 сентября 2010

Я должен удалить большое количество данных. усечь невозможно из-за отношений. И я не хочу бросать стол из-за взглядов. Я использую код ниже, но есть ли лучшая идея?

delete from table
WHILE 1=1
BEGIN
BEGIN TRAN
DELETE  top (1000000) from table
IF @@rowcount < 1000000 BREAK
WAITFOR DELAY '00:00:00:010'
COMMIT
end  
DELETE  from table

Ответы [ 2 ]

4 голосов
/ 02 сентября 2010

Усеченный стол был бы лучшим на сегодняшний день.

Если вы беспокоитесь об отношениях из-за ссылочной целостности, то я предлагаю вам отдельно обновить те таблицы, которые ссылаются на него по внешнему ключу (например, если внешние ключи имеют ON DELETE SET NULL, тогда UPDATE RefTbl SET Key = NULL WHERE Key IS NOT NULL, аналогично, удалитеесли каскад и т.д. ...).

В качестве альтернативы, если вы не хотите этого, вы можете изменить свой запрос, чтобы он был немного быстрее, используя ROWCOUNT:

--other code for loop
SET ROWCOUNT 1000000 --this limits the number of rows that will be processed
DELETE FROM Table1

Также яя не уверен, почему вы делаете это внутри транзакции?Это создаст огромный журнал транзакций и сильно повлияет на вашу производительность ... Когда вы выполняете такие вещи, как дамп содержимого таблицы, транзакции обычно не актуальны (это может быть актуально в вашем случае, но я просто говорю, что это редко так),Если вам нужна транзакция, то хотя бы уберите отсрочку ...

1 голос
/ 02 сентября 2010

Вы могли бы сделать это немного проще:

delete table where id in (select top 1000000 id from table)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...