我有一個包含200,000條記錄的表。我想刪除一些數據,如下所示:在sql中刪除查詢的性能
DELETE FROM Table Where IdColumn IN (SelectedID)
SelectedID填寫我想要的數據身份,其中包含5000條記錄。有兩種方法:
1-我插入20,000身份作爲SelectedID,其中包含所需的5000個記錄的身份。
2-我只插入5000條記錄的標識。
問題是兩種方法有什麼區別? (性能)
我有一個包含200,000條記錄的表。我想刪除一些數據,如下所示:在sql中刪除查詢的性能
DELETE FROM Table Where IdColumn IN (SelectedID)
SelectedID填寫我想要的數據身份,其中包含5000條記錄。有兩種方法:
1-我插入20,000身份作爲SelectedID,其中包含所需的5000個記錄的身份。
2-我只插入5000條記錄的標識。
問題是兩種方法有什麼區別? (性能)
一個大的IN
子句的性能是可怕的,這主要是由於查詢編譯時間。所以,如果你有說包含List<int>
的ID則是:
List<int> myIDs = GetIDs(); //20,000
var inList = myIDs.Distinct(); //5,000 distinct IDs
//pass inList to SQL
將遠快於:
List<int> inList = GetIDS(); //20,000
//pass inList to SQL
如果加盟是一種選擇,如果你能得到你想要的ID列表中通過查詢刪除,這是更好地做一個子查詢,這樣的事情,在Where
使用查詢:
DELETE FROM Table
Where IdColumn IN (Select ID
From OtherTable
Where Name Like '%DeleteMe%')
我不知道,如果你的列表來自一個EXTE不能像這樣確定...但如果可以的話,你的刪除速度會更快。
感謝Nick。我通過返回逗號分隔的字符串在我的應用程序中創建所需的身份。 –
然後將此字符串傳遞給DELETE過程,使用表值UDF將其拆分到sProc中,並將其與要從中刪除的表結合。 –
@masoud ramezani - 你沒有打這個字符串長度限制嗎? –
我不太確定,如果我完全理解你,但我會去#2,因爲它似乎是浪費資源來產生20.000行,其中你只需要5.000而不是隻插入需要5.000。
此外,200.000行是一個小表。真!
是的我知道200.000行是一個小表。這是一個樣本。你可以乘以100. –
在我的應用程序中,我可以搜索5000條記錄,但這是浪費時間,因此我不搜索我的數據並將所有數據身份傳遞給IN子句。 –
你的意思是在方法一將是重複15000重複? – Pentium10
在第一種方法中我有15000身份,表中沒有。但我不知道這一點。 (在我的應用程序中) –