оптимизация оператора DELETE с счетчиком - PullRequest
2 голосов
/ 28 сентября 2010

Какой из следующих двух операторов вы считаете наиболее эффективным для удаления большого количества строк?

Оператор № 1:

DELETE TOP (@count) FROM ProductInfo WHERE productId = @productid

Оператор № 2: Производная таблица

DELETE t1 FROM (SELECT TOP (@count) * from ProductInfo 
                WHERE productId = @productId v) t1

Ответы [ 2 ]

6 голосов
/ 28 сентября 2010

и то и другое. При работе с большим числом необходимо удалять пакетами из-за проблем с ростом журнала транзакций. Предполагая, что вы хотите удалить все записи для данного @productId:

declare @batchSize int = 10000;
do while(1=1)
begin
   delete top(@batchSize) from ProductInfo where productId = @productId;
   if (0 = @@rowcount)
      break;
end

Две опубликованные вами формы DELETE в основном идентичны, важно то, что таблица организована по кластерному ключу на основе ключа productId. Если это не так, и у вас индекс NC на productId, тогда @batchSize необходимо откалибровать, чтобы избежать точки опрокидывания индекса .

2 голосов
/ 28 сентября 2010

Поскольку оба запроса выполняют одну и ту же задачу, я бы использовал первый, потому что их проще читать и понимать.

(Кроме того, поскольку оба запроса выполняют одну и ту же работу, я подозреваю, что они сгенерируют один и тот же план выполнения - вы можете проверить это?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...