SQL Serverストアドプロシージャはデータ結果をキャッシュしますか?


11

これは友人から聞いたことがありますが、これが本当かどうかは調査していません。

実行されたクエリのデータ結果がキャッシュに保存されるのは本当ですか?

つまり、次のようなストアドプロシージャがあるとします。

SELECT * FROM USERLIST

...結果(この場合はユーザーのリスト)がキャッシュに保存されるのは本当ですか?

また、私がこれらを持っている場合:

SELECT * FROM USERLIST WHERE user="user"
SELECT * FROM USERLIST WHERE user="userzzz"

(user / userzzzがパラメーターとして渡されます)、データベースキャッシュに2つの異なる結果を格納することは正しいですか。

そうは思いませんが、専門家の確認をお願いします!


ちょうどmarc_sによって、あなたのために今答えstackoverflow.com/questions/8559443/...

回答:


19

クエリ結果はキャッシュされません

ただし、ソーステーブルとインデックスデータおよびメタデータは、最初の使用後にキャッシュされます(ただし、継続使用、ロード、およびメモリの負荷がかかる場合があります)。

つまり、クエリの結果は実行のたびに評価されますが、クエリで使用されるテーブル(およびインデックスなど)はすでにメモリにある可能性が高いです。

コンパイルされた実行プランはキャッシュされますが、混乱が生じていると思います


「つまり、クエリの結果は実行ごとに評価されますが、クエリで使用されるテーブル(およびインデックスなど)はすでにメモリにある可能性が高いです。」:ええ、私もSPを使用していないと思います...それはデータベースの最適化であり、Spには関係ありません。

@markzzz:ほとんどすべてのSQLは、実行プランにコンパイルされる直接UPDATE、SELECTまたはストアドプロシージャかどうか
GBN

6

ストアドプロシージャが実行されると、最適化およびコンパイルされ、クエリプランがプロシージャキャッシュに配置されます。

プロシージャは、スペースがある限り、他のユーザーのキャッシュに残ります。プロシージャは、最長時間未使用(LRU)アルゴリズムを使用して削除されます。


ストアドプロシージャの最初の実行では、ディスク上のsysproceduresからの取得が必要ですが、その後の実行では、最適化されたプランをプロシージャキャッシュから単に取得することが可能です。この動作により、パフォーマンスが大幅に向上する可能性があります。

したがって、キャッシュにあるのは、ストアドプロシージャの結果ではなく、ストアドプロシージャからの最適化されたプランです。


6

クエリをSQL Serverで処理する準備ができると、SQLマネージャはでクエリを検索しますcache。ない場合は、コンパイルする必要があります。コンパイルプロセスには、いくつかのものが含まれます。

ストアドプロシージャが実行されると、最適化およびコンパイルされます。これに従って、クエリプランはプロシージャキャッシュに配置されます。

クエリ処理などの詳細については、Microsoft SQL Serverクエリプロセッサの内部とアーキテクチャ に関するCompilation and Executionセクションを 確認してください。

コンパイルフェーズの最終製品はクエリプランで、プロシージャキャッシュに入れられます。SQLクエリの結果/操作のサイズはMB、GBになる可能性があるため、プロシージャキャッシュまたはクエリプランには入れられません。

次の図(MSDNから)をチェックして、ストアドプロシージャの実行について質問を明確にします。 ここに画像の説明を入力してください


-1

SQL Serverは基本的にこれらの手順を実行して、クエリ(ストアドプロシージャコールまたはアドホックSQLステートメント)を実行します。

1)クエリを構文的にチェックします
2)問題がないかどうか-プランキャッシュをチェックして、クエリの実行プランがすでにあるかどうかを確認します
3)実行プランがあるかどうか-そのプランが(再)使用され、クエリが実行されます
4)プランがまだない場合は、実行プランが決定されます
5)そのプランは後で再利用するためにプランキャッシュに保存され
ます6)クエリが実行されます

(Marc_s回答のコピー)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.