-1

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

我的删除查询

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

2 回答 2

0

那是因为您的查询需要在数据库的每一行上运行 SUBSTRINGfuncion 以检查它是否符合条件。您应该始终避免使用 WHERE 子句上的函数。即使你有索引,它们也不会被使用。

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

编辑:与主要问题无关,但仍是讨论的一部分。索引用法: 在此处输入图像描述

于 2012-10-08T09:03:21.617 回答
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;
于 2012-10-08T08:57:45.950 回答