我的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'
没有通过任何措施最好查询不是。您的子字符串以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;
这就是:要防止tempdb的空间问题或过大的交易(锁定),我会打破它分成位条件。你应该总是避免在WHERE子句中使用funcions。即使你有索引,他们也不会被使用。
如果花费那么多,它的通用操作,你可以考虑坚持在DB该值的结果,并在其上创建索引
编辑: 无关的主要问题,但仍是讨论的一部分。 索引用法:
这取决于您的PC ..您的查询没有问题 –
因为它不使用'INDEX'。 –