sql中删除查询的性能

时间:2010-02-08 11:47:36

标签: sql sql-server performance tsql

我有一张包含200,000条记录的表格。我想删除一些如下数据:

DELETE FROM Table Where IdColumn IN ( SelectedID )

SelectedID填充包含5000条记录的理想数据标识。有两种方法:

1-我将20,000个身份作为SelectedID插入,其中包含所需5000条记录的标识。

2-我只插入5000条记录的身份。

问题是两种方法有什么区别? (性能)

2 个答案:

答案 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行是一张小表。真!