SQL Server 2005: удаление оптимизации - PullRequest
2 голосов
/ 08 сентября 2010

Является ли это наиболее эффективным способом удаления из таблицы DeletedProducts, если в таблице ProductFileInfo нет ссылок?

Пример:

DELETE FROM DeletedProducts 
WHERE ProductId NOT IN SELECT DISTINCT ProductID FROM ProductFileInfo

Или NOT EXIST лучший способ сделать это.

Примечание: ProductFileInfo содержит более 20 миллионов записей.

Я использую SQL Server 2005 Standard.

Спасибо

Ответы [ 4 ]

3 голосов
/ 08 сентября 2010

NOT IN и NOT EXISTS, вероятно, создадут один и тот же план.Сколько строк вы собираетесь удалить?Если это много, я бы делал пакеты по 5К или 10К таким образом, что вы не заполнили бы свой ЛОГ одной большой транзакцией, а затем, если она по какой-то причине не сработала, нужно выполнить большой откат

, например

DELETE top 5000
from sometable
where ....
go 100 --will be executed 100 times

, чтобы GO N работал, вам нужны SSMS и пакет обновления 2 (IIRC), но, конечно, вы также можете написать цикл while .. while @@rowcount > 0 .......

0 голосов
/ 08 сентября 2010

Ну, я обычно пишу что-то вроде

delete d
from TableToDeleteFrom d
where not exists(select top 1 1 from SomeOtherTable sot where sot.ThatId = d.ThatId)

Возможно, вы не хотите блокировать справочную таблицу, поэтому вы можете указать with(readpast) подсказка или with(nolock).

0 голосов
/ 08 сентября 2010

попробуй несколько решений и проверь их производительность, YMMV. Также попробуйте внешнее соединение

DELETE FROM DeletedProducts d left outer join ProductFileInfo p
on d.ProductId  = p.ProductId  WHERE p.ProductID is null
0 голосов
/ 08 сентября 2010

Это отличный ресурс для того, что именно вы спрашиваете.

http://www.sql -server-performance.com / советы / t_sql_where_p3.aspx

...