我对一个表中的大约 1,300,000 条记录进行了查询。它获取满足某些 WHERE 条件的某些记录并将它们插入到另一个表中。它首先完全清除目标表。
每次 Execute 完成查询所需的时间会大大缩短:
1st: 5 minutes, 3 seconds
2nd: 2 minutes, 43 seconds
3rd: 12 seconds
4th: 3 seconds
除了点击执行之外,我什么也没做。我的查询看起来像这样(出于长度目的,有些缩写):
DELETE FROM dbo.ConsolidatedLogs --clear target table
DECLARE @ClientID int
DECLARE c CURSOR FOR SELECT ClientID FROM dbo.Clients
OPEN c
FETCH NEXT FROM c INTO @ClientID --foreach LogID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO dbo.ConsolidatedLogs
(col1, col2)
SELECT col1, col2
FROM dbo.CompleteLogsRaw
WHERE col3 = true AND
ClientID = @ClientID
FETCH NEXT FROM c INTO @ClientID
END
CLOSE c
DEALLOCATE c
如何/为什么会发生这种情况?SQL Server 究竟在做什么使这成为可能?
此查询将作为 SQL Server 代理作业运行,每 3 小时运行一次。每次都需要整整 5 分钟,还是会更短,因为作业只运行这一个查询,即使它有 3 小时的延迟?