2010-02-08 98 views
0

我有一個包含200,000條記錄的表。我想刪除一些數據,如下所示:在sql中刪除查詢的性能

DELETE FROM Table Where IdColumn IN (SelectedID) 

SelectedID填寫我想要的數據身份,其中包含5000條記錄。有兩種方法:

1-我插入20,000身份作爲SelectedID,其中包含所需的5000個記錄的身份。

2-我只插入5000條記錄的標識。

問題是兩種方法有什麼區別? (性能)

+0

你的意思是在方法一將是重複15000重複? – Pentium10

+0

在第一種方法中我有15000身份,表中沒有。但我不知道這一點。 (在我的應用程序中) –

回答

1

一個大的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不能像這樣確定...但如果可以的話,你的刪除速度會更快。

+0

感謝Nick。我通過返回逗號分隔的字符串在我的應用程序中創建所需的身份。 –

+1

然後將此字符串傳遞給DELETE過程,使用表值UDF將其拆分到sProc中,並將其與要從中刪除的表結合。 –

+0

@masoud ramezani - 你沒有打這個字符串長度限制嗎? –

0

我不太確定,如果我完全理解你,但我會去#2,因爲它似乎是浪費資源來產生20.000行,其中你只需要5.000而不是隻插入需要5.000。

此外,200.000行是一個小表。真!

+0

是的我知道200.000行是一個小表。這是一個樣本。你可以乘以100. –

+0

在我的應用程序中,我可以搜索5000條記錄,但這是浪費時間,因此我不搜索我的數據並將所有數據身份傳遞給IN子句。 –