1 つのテーブルで約 1,300,000 レコードに対してクエリを実行しました。いくつかの WHERE 条件を満たす特定のレコードを取得し、それらを別のテーブルに挿入します。まず、ターゲット テーブルを完全にクリアします。
クエリを完了するのにかかる時間は、実行ごとに大幅に改善されます。
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 は正確に何をしているのでしょうか?
このクエリは、3 時間ごとに 1 回、SQL Server エージェント ジョブとして実行されます。毎回 5 分かかるのでしょうか、それとも 3 時間の遅延があっても、ジョブがこの 1 つのクエリしか実行していないために短くなるでしょうか?