我的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'。 –