2012-10-08 279 views
-1

我的SQL Server 2008表有500多万条记录。我正在删除单个语句中的400多万条记录。这需要一个多小时。这是删除记录的最佳查询吗?删除语句花费太多时间

我删除查询

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

这取决于您的PC ..您的查询没有问题 –

+3

因为它不使用'INDEX'。 –

回答

0

没有通过任何措施最好查询不是。您的子字符串以1开头,您将与单个字符'4'进行比较!要在ColumnYYY上使用索引,只需将其更改为一个LIKE子句,让索引快速搜索前两个字符。

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

如果没有以您的表的80%为目标,那么SQL Server就会完全扫描表。因为您的查询需要对数据库的每一行运行SUBSTRINGfuncion检查它是否符合

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; 
0

这就是:要防止tempdb的空间问题或过大的交易(锁定),我会打破它分成位条件。你应该总是避免在WHERE子句中使用funcions。即使你有索引,他们也不会被使用。

如果花费那么多,它的通用操作,你可以考虑坚持在DB该值的结果,并在其上创建索引

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

+0

是的,我说过。我只是提到了索引,只有当你将子字符串函数的结果保留在列上并直接检查 – Diego

+0

你错了,请检查打印屏幕。它显示正在使用的索引 – Diego

+0

您正在使用LIKE与%。我的回答是,数据应该被保留,然后与真正要删除的字符串进行比较。我看起来这个工作非常好,特别是在你有一个表的日期字段,并希望从第5个月删除所有的东西的日期,所以你不用运行删除,其中minth(列)= 5,你有一个持续的计算列与月份(列)公式,然后做你的检查。 仅供参考,如果您运行删除testindex其中value ='{80';在你的例子中,你会看到一个索引寻求 – Diego