當查詢必須連接到另一個表時,從SQL Server數據庫中刪除記錄以進行大型年終清除的最快方法是什麼?我明白遊標很慢。我該怎麼辦使用連接快速刪除記錄的最有效方法?
DELETE FROM table1 WHERE table1_id in (SELECT table1_id FROM table2 WHERE whatever)
好像它可能會更快的加入到表使用不同的技術,一些查詢裏面像
DELETE FROM table1 WHERE table1_id = table2
當查詢必須連接到另一個表時,從SQL Server數據庫中刪除記錄以進行大型年終清除的最快方法是什麼?我明白遊標很慢。我該怎麼辦使用連接快速刪除記錄的最有效方法?
DELETE FROM table1 WHERE table1_id in (SELECT table1_id FROM table2 WHERE whatever)
好像它可能會更快的加入到表使用不同的技術,一些查詢裏面像
DELETE FROM table1 WHERE table1_id = table2
一個連接將是最好的一段路要走。
我假設你有一個從table2
到table1
的外鍵關聯,所以你要從主表之前的第二個表中刪除。
例子:
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
如果試圖從主表中刪除第一,你可能會遇到一個外鍵約束衝突。
謝謝大家,我將使用連接技術。我是否也可以使用相同的技術用於UPDATE語句,而不必包含子查詢? – draca 2013-04-26 23:08:50
你可以在外鍵上添加級聯刪除關係,然後讓SQL服務器級聯你的刪除?
也許這樣的事情會更快。
從刪除(SELECT * FROM表1 WHERE table1_id在(SELECT table1_id FROM表2 WHERE其他))
你可以試試這個(應該比語句更快,因爲查詢將停止,比找到子查詢和搜索第一個值下一個值):
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
加入總是快的,我相信。你問如何做一個加入? – user1477388 2013-04-26 13:19:35
我在http://www.johnsansom.com/fast-sql-server-delete/中發現了這項技術,它的效果令人驚訝(當我讀它時,我感到很懷疑)。它指的是有序的刪除,但我想象提取子查詢是重點,並將適用於您的方案。 – Jay 2013-04-26 13:22:48
在決定之前,您應該查看執行計劃,在這兩種情況下,查詢優化器都可能出現相同的執行計劃。 – iruvar 2013-04-26 13:29:23