我有一张包含200,000条记录的表格。我想删除一些如下数据:
DELETE FROM Table Where IdColumn IN ( SelectedID )
SelectedID填充包含5000条记录的理想数据标识。有两种方法:
1-我将20,000个身份作为SelectedID插入,其中包含所需5000条记录的标识。
2-我只插入5000条记录的身份。
问题是两种方法有什么区别? (性能)答案 0 :(得分: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%')
我不确定您的列表是否来自外部来源,无法像这样确定...但如果可以,您的删除速度会非常快。
答案 1 :(得分:0)
我不确定,如果我完全理解你,但我会选择#2,因为它似乎浪费资源来生成20.000行,其中你只需要5.000而不是仅插入所需的5.000。
另外,200.000行是一张小表。真!