有幾件事情,可能會導致刪除緩慢。你已經在評論中閱讀了它。
例如,您需要3M行/ 1k行= 3000次才能進行沒有idndex的搜索。更重要的是,由於缺少索引,你在表格上強加了3000次獨佔鎖定。
這是我在生產中的「刪除」模式。它解決了這些問題,即使沒有合適的索引。鎖僅在主鍵上且僅在刪除期間。
SET NOCOUNT ON
DECLARE
@StartDate DateTime = '20130101',
@EndDate DateTime = '20131201'
DECLARE @chunk_size bigint = 1000
DECLARE @RowCount bigint;
DECLARE @delay DATETIME = '00:00:01' --- 1 second by defaul, Used for delaying the updates inside the loop, can be 0
DECLARE @Chunk_IDs as TABLE (
[ID] int NOT NULL,
[SourcePKID] int not null
);
IF OBJECT_ID('tempdb..#temp_OldDataIDs') is not null
DROP TABLE #temp_OldDataIDs;
CREATE TABLE #temp_OldDataIDs (
[ID] INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
[SourcePKID] INT NOT NULL,
[DeletedStatus] BIT NOT NULL DEFAULT 0);
INSERT INTO #temp_OldDataIDs ([SourcePKID])
SELECT [ID]
FROM WorkflowContentDetails
WHERE StartDateTime BETWEEN @StartDate AND @EndDate
SET @RowCount = @@ROWCOUNT;
CREATE NONCLUSTERED INDEX IX_#temp_OldDataIDs on #temp_OldDataIDs ([DeletedStatus]) include([ID],SourcePKID)
WHILE (@RowCount != 0)
BEGIN
DELETE @Chunk_IDs;
INSERT INTO @Chunk_IDs ([ID], [SourcePKID])
SELECT TOP (@chunk_size)
[ID], [SourcePKID]
FROM #temp_OldDataIDs
WHERE [DeletedStatus] = 0
ORDER BY [ID];
SET @RowCount = @@ROWCOUNT;
IF @RowCount = 0 BREAK;
DELETE WorkflowContentDetails
FROM WorkflowContentDetails
INNER JOIN @Chunk_IDs ChunkIDs ON WorkflowContentDetails.[ID] = ChunkIDs.[ID];
UPDATE OldIDs
SET [DeletedStatus] = 1
FROM #temp_OldDataIDs OldIDs
INNER JOIN @Chunk_IDs ChunkIDs ON OldIDs.[ID] = ChunkIDs.[ID];
-- debug
-- PRINT CAST(@RowCount as varchar(30)) + ' ' + CONVERT(varchar(30), GETDATE(),121)
-- The requested delay will hold the loop here as requested.
WAITFOR DELAY @delay
END
GO
這需要多長時間?'SELECT COUNT(*)FROM WorkflowContentDetails WHERE的startDateTime BETWEEN @StartDate和@ EndDate'這裏你可以找到一些可能的原因:http://stackoverflow.com/a/10901711/284240 –
是'StartDateTime'索引?如果不是,那麼WHERE子句將在每次迭代中連續採用較長的時間,因爲它需要掃描先前讀取的非匹配行。 –
你能告訴我們你在WorkflowContentDetails上的索引嗎? –