2010-09-08 6 views
2

Это самый эффективный способ удалить из таблицы DeletedProducts, где нет ссылок, найденных в таблице ProductFileInfo?SQL Server 2005: Оптимизация удаления

Пример:

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

Или NOT EXIST лучший способ выполнить это.

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

Стандарт SQL Server 2005 - это то, что я использую.

Благодаря

+0

Если вы отправляете (T-SQL) код или XML, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис ! –

ответ

3

НЕ В и НЕ СУЩЕСТВУЕТ, вероятно, производят один и тот же план. Сколько строк вы собираетесь удалить? Если это много, я бы партии 5K или 10K таким образом, вы не наполнит ваш LOG с одной крупной сделки, а затем, если он не по какой-то причине он должен сделать большой Перемотка

, например

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

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

-1

Это большой ресурс за то, что вы просите.

http://www.sql-server-performance.com/tips/t_sql_where_p3.aspx

+0

Я рассмотрел первые пару советов, и они кажутся очень сомнительными (возможно, они были когда-то верны, но они неверны для SQL Server 2005+) –

+0

Это довольно несправедливо из вас, это было написано уважаемым автором в сообществе , и я видел несколько презентаций, которые были даны на нескольких его страницах другими уважаемыми докладчиками еще 2 недели назад. – user404463

+0

@daytona - Я тоже был немного удивлен тем, что помимо этого было имя Брэда МакГи. Интересно, написал ли он некоторое время назад, а кто-то еще обновил его, чтобы сказать, что он применяется к SQL2005. В SQL 2005+, хотя [Not In vs Not Exists] (http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/) и [In vs Exists] (http://sqlinthewild.co.za/index.php/2009/08/17/exists-vs-in/). Сделайте некоторые эксперименты самостоятельно. Если вы найдете какие-то разные, дайте мне знать! –

0

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

DELETE FROM DeletedProducts d left outer join ProductFileInfo p 
on d.ProductId = p.ProductId WHERE p.ProductID is null 
0

Ну, я обычно пишу что-то вдоль линий

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

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