我的 sql Server 2008 表有超过 500 万条记录。我在单个语句中删除了超过 400 万条记录。需要一个多小时。这是删除记录的最佳查询吗?
我的删除查询
delete From [Table]
where SUBSTRING([Column_YYY],1,CHARINDEX(N'',[Column_YYY])-1) = '4'
我的 sql Server 2008 表有超过 500 万条记录。我在单个语句中删除了超过 400 万条记录。需要一个多小时。这是删除记录的最佳查询吗?
我的删除查询
delete From [Table]
where SUBSTRING([Column_YYY],1,CHARINDEX(N'',[Column_YYY])-1) = '4'
那是因为您的查询需要在数据库的每一行上运行 SUBSTRINGfuncion 以检查它是否符合条件。您应该始终避免使用 WHERE 子句上的函数。即使你有索引,它们也不会被使用。
如果它占用了那么多并且它是一个常见的操作,您可以考虑将该值的结果保存在数据库上并在其上创建一个索引
编辑:与主要问题无关,但仍是讨论的一部分。索引用法:
不,这无论如何都不是最好的查询。您的子字符串以 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;