2017-02-23 50 views
0

如果我有兩個非常大的表(TableA和TableB),它們都帶有Id列,並且我想從TableA中刪除其Ids中存在的所有行表B。哪一個會是最快的?爲什麼?SQL DELETE性能,T-SQL或ISO兼容查詢

--ISO-compatible 
DELETE FROM TabelA 
WHERE Id IN (SELECT Id FROM TableB) 

-- T-SQL 
DELETE A FROM TabelA AS A 
INNER JOIN TableB AS B 
ON A.Id = B.Id 
+1

你應該在系統上運行的數據查詢。我預計在大多數情況下,表現會非常相似,但如果你真的在乎,那就試試兩種。 –

+1

查詢語法並不重要 - 從中​​創建的執行計劃是重要的。如果執行計劃相同,則性能將相同 –

回答

2

如果有每個Id指標,就應該同樣表現出色。

如果每個Id上沒有索引,則exists()in()可能表現更好。

一般而言,我更喜歡exists()而不是in(),因爲它允許您在需要時輕鬆添加多個比較。

delete a 
from tableA as a 
where exists (
    select 1 
    from tableB as b 
    where a.Id = b.Id 
) 

參考:

1

只要你在TableB ID是唯一的,這兩個查詢應創建相同的執行計劃。只需將執行計劃包含在每個查詢中並進行驗證即可。

在這個不錯的職位請看:in-vs-join-vs-exists

1

有一個簡單的方法來找出使用執行計劃(按Ctrl + L上SSMS)。

因爲我們不知道表格後面的數據模型(最終索引等),所以我們無法確定哪個查詢將是最快的。根據經驗,我可以告訴你,對於非常大的表(> 1mil行),由於所有日誌記錄,delete子句非常緩慢。根據您正在執行的操作,您將希望SQL Server不要記錄刪除。

你可能要檢查這個問題: How to delete large data of table in SQL without log?