删除声明需要花费太多时间

时间:2012-10-08 08:48:27

标签: sql sql-server-2008-r2

我的sql Server 2008表有500多万条记录。我在单个声明中删除了超过400万条记录。这花了一个多小时。这是删除记录的最佳查询吗?

我的删除查询

delete From [Table] 
where SUBSTRING([Column_YYY],1,CHARINDEX(N'',[Column_YYY])-1) = '4'

2 个答案:

答案 0 :(得分:0)

不,这不是最好的查询。您的子字符串以1开头,并且您正在与单个字符'4'进行比较!要在ColumnYYY上使用索引,只需将其更改为LIKE子句,让索引快速搜索前两个字符。

delete [Table] 
where [Column_YYY] LIKE N'4%'

如果没有以80%的表为目标,那将是真的,在这种情况下,SQL Server将完全扫描表。为了防止tempdb空间问题或过大的事务(锁定),我会将其分解为位:

set nocount on
select 1;
while @@rowcount > 0
begin
    ;with x as (select top 100000 * from [Table] where [Column_YYY] LIKE N'4%')
    delete x;
end;

答案 1 :(得分:0)

那是因为您的查询需要在DB的每一行上运行SUBSTRINGfuncion以检查它是否与条件匹配。您应该始终避免在WHERE子句上使用功能。即使你有索引,它们也不会被使用。

如果它占用了那么多并且它是一个常见的操作,你可以考虑在DB上保存该值的结果并在其上创建索引

编辑: 与主要问题无关,但仍然是讨论的一部分。 索引用法: enter image description here