2

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 つのクエリしか実行していないために短くなるでしょうか?

4

2 に答える 2

8

実行するたびに同一のクエリが高速化する場合、物事がキャッシュされている可能性が非常に高くなります。では、どこにキャッシュできるのでしょうか。

  • SQLServerクエリプランキャッシュ
  • SQLServerのクエリキャッシュ
  • オペレーティングシステムのIOバッファ
  • ハードディスクコントローラキャッシュ
  • ハードディスクオンディスクキャッシュ

実行の合間にSQLServerクエリキャッシュをクリアして、そのキャッシュの影響を確認できます。

SQL Serverクエリキャッシュをクリアするにはどうすればよいですか?

SQL Serverは、専用のRAMを使用して、頻繁にアクセスするものをディスクではなくRAMに保持します。同じクエリを実行すればするほど、通常はディスク上にあるデータが代わりにRAMに存在する可能性が高くなります。

OSレベルとハードウェアレベルのキャッシュは、結果の改善に貢献しているかどうかを確認したい場合は、再起動を実行することで最も簡単にリセットできます。

SQL Serverがクエリの実行ごとに使用するクエリプランを公開すると、より詳細な診断が可能になります。

于 2012-08-28T02:44:00.960 に答える
1

SqlServerがEnterpriseManagerでクエリを実行すると、最初の実行後に「実行」または「クエリプラン」が作成され、そのプランがキャッシュされます。「クエリプラン」は、一言で言えば、SQL Serverが結果を満たすために必要なテーブル、フィールド、インデックス、およびデータを攻撃する方法を説明します。再実行するたびに、そのクエリはプランキャッシュからフェッチされ、クエリプリプロセッサが通常実行する必要のある「重労働」は省略されます。これにより、2回目以降の実行でクエリをより迅速に実行できます。

念のために言っておきますが、これははるかに詳細な(したがって、本質的にクールな)プロセスを過度に単純化したものですが、それはクエリプラン101です:)

于 2012-08-28T02:45:04.347 に答える