我的sql Server 2008表有500多万条记录。我在单个声明中删除了超过400万条记录。这花了一个多小时。这是删除记录的最佳查询吗?
我的删除查询
delete From [Table]
where SUBSTRING([Column_YYY],1,CHARINDEX(N'',[Column_YYY])-1) = '4'
答案 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上保存该值的结果并在其上创建索引
编辑: 与主要问题无关,但仍然是讨论的一部分。 索引用法: