2013-04-26 57 views
2

當查詢必須連接到另一個表時,從SQL Server數據庫中刪除記錄以進行大型年終清除的最快方法是什麼?我明白遊標很慢。我該怎麼辦使用連接快速刪除記錄的最有效方法?

DELETE FROM table1 WHERE table1_id in (SELECT table1_id FROM table2 WHERE whatever) 

好像它可能會更快的加入到表使用不同的技術,一些查詢裏面像

DELETE FROM table1 WHERE table1_id = table2 
+0

加入總是快的,我相信。你問如何做一個加入? – user1477388 2013-04-26 13:19:35

+0

我在http://www.johnsansom.com/fast-sql-server-delete/中發現了這項技術,它的效果令人驚訝(當我讀它時,我感到很懷疑)。它指的是有序的刪除,但我想象提取子查詢是重點,並將適用於您的方案。 – Jay 2013-04-26 13:22:48

+0

在決定之前,您應該查看執行計劃,在這兩種情況下,查詢優化器都可能出現相同的執行計劃。 – iruvar 2013-04-26 13:29:23

回答

2

一個連接將是最好的一段路要走。

我假設你有一個從table2table1的外鍵關聯,所以你要從主表之前的第二個表中刪除。

例子:

DELETE T2 
FROM table1 T1 
JOIN table2 T2 ON -- JOIN CRITERIA HERE 
WHERE -- FILTER CRITERIA HERE 

DELETE T1 
FROM table1 T1 
JOIN table2 T2 ON -- JOIN CRITERIA HERE 
WHERE -- FILTER CRITERIA HERE 

如果試圖從主表中刪除第一,你可能會遇到一個外鍵約束衝突。

+0

謝謝大家,我將使用連接技術。我是否也可以使用相同的技術用於UPDATE語句,而不必包含子查詢? – draca 2013-04-26 23:08:50

0

你可以在外鍵上添加級聯刪除關係,然後讓SQL服務器級聯你的刪除?

0

也許這樣的事情會更快。

從刪除(SELECT * FROM表1 WHERE table1_id在(SELECT table1_id FROM表2 WHERE其他))

0

你可以試試這個(應該比語句更快,因爲查詢將停止,比找到子查詢和搜索第一個值下一個值):

DELETE t1 
FROM table1 t1 
WHERE EXISTS (SELECT 0 
       FROM table2 t2 
       WHERE t1.table1_id = t2.table1_id 
       AND whatever) 

或者你可以做JOIN:

DELETE t1 
FROM table1 t1 
JOIN table2 t2 ON t1.table1_id = t2.table1_id 
WHERE whatever 
相關問題