2012-10-08 330 views
-1

我的SQL Server 2008表有500多萬條記錄。我正在刪除單個語句中的400多萬條記錄。這需要一個多小時。這是刪除記錄的最佳查詢嗎?刪除語句花費太多時間

我刪除查詢

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

這取決於您的PC ..您的查詢沒有問題 –

+3

因爲它不使用'INDEX'。 –

回答

0

沒有通過任何措施最好查詢不是。您的子字符串以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; 
0

這就是:要防止tempdb的空間問題或過大的交易(鎖定),我會打破它分成位條件。你應該總是避免在WHERE子句中使用funcions。即使你有索引,他們也不會被使用。

如果花費那麼多,它的通用操作,你可以考慮堅持在DB該值的結果,並在其上創建索引

編輯: 無關的主要問題,但仍是討論的一部分。 索引用法: enter image description here

+0

是的,我說過。我只是提到了索引,只有當你將子字符串函數的結果保留在列上並直接檢查 – Diego

+0

你錯了,請檢查打印屏幕。它顯示正在使用的索引 – Diego

+0

您正在使用LIKE與%。我的回答是,數據應該被保留,然後與真正要刪除的字符串進行比較。我看起來這個工作非常好,特別是在你有一個表的日期字段,並希望從第5個月刪除所有的東西的日期,所以你不用運行刪除,其中minth(列)= 5,你有一個持續的計算列與月份(列)公式,然後做你的檢查。 僅供參考,如果您運行刪除testindex其中value ='{80';在你的例子中,你會看到一個索引尋求 – Diego