関数の実行計画がSQLサーバーにキャッシュされているかどうかを理解するのに役立つ体はありますか?
このためのオンラインリソースはありますか?
関数の実行計画がSQLサーバーにキャッシュされているかどうかを理解するのに役立つ体はありますか?
このためのオンラインリソースはありますか?
受け入れられた回答は、主に「ユーザー定義関数」という用語に関して参照された引用が曖昧すぎるため、不正確/誤解を招くものです。
Microsoft SQL Server にはいくつかの異なる種類のユーザー定義関数があり、それらは異なる方法で扱われます。
マルチステートメント TVF:
これらは、ストアド プロシージャのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「Compiled Plan」および「Proc」の で表示さsys.dm_exec_cached_plans
れcacheobjtype
ますobjtype
。入力パラメーター値もプランと共に保存されるため、マルチステートメント TVF はパラメーター スニッフィングの問題の影響を受けます。
インライン TVF (iTVF):
これらはビューのように扱われます。それらを実行するクエリには、それらの定義が組み込まれています。それらは、「解析ツリー」と「ビュー」の で表示さsys.dm_exec_cached_plans
れcacheobjtype
ますobjtype
。入力パラメーター値はプランと共に保存されないため、インライン TVF はパラメーター スニッフィングの問題の影響を受けません。
スカラー UDF:
これらは、ストアド プロシージャのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「Compiled Plan」および「Proc」の で表示さsys.dm_exec_cached_plans
れcacheobjtype
ますobjtype
。入力パラメーター値もプランと共に保存されるため、スカラー UDF はパラメーター スニッフィングの問題の影響を受けます。また、上記の 2 種類の TVF とは異なり、通常のストアド プロシージャと同様に、実行時にorの代わりにWITH RECOMPILE
オプションを使用して、実行プランの再コンパイルを強制できます。EXEC[UTE]
SELECT
SET
SQLCLR オブジェクト:
これらは、クライアント/アプリ コードのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「CLR Compiled Func」または「CLR Compiled Proc」、および「Proc」の で表示さsys.dm_exec_cached_plans
れcacheobjtype
ますobjtype
。ただし、マルチステートメント TVF やスカラー UDF とは異なり、これらには定義がないため、クエリ プランが関連付けられていません。ただし、それらが実行するアドホック クエリ (ストアド プロシージャ コールではない) は、"コンパイル済みプラン" および "準備済み" で表示さsys.dm_exec_cached_plans
れcacheobjtype
ますobjtype
。これらのアドホック クエリはいずれも、パラメーター化されている場合、準備されたプランと共に初期入力パラメーター値を格納する必要があるため、パラメーター スニッフィングの問題が発生する可能性があります。
オブジェクト キャッシュの詳細については、キャッシュ メカニズムに関する MSDN ページを参照してください。
はい、実行プランのキャッシュに入れられます。
sys.dm_exec_query_plan DMVは、指定されたプランハンドルのプランを表示します。そこからの引用:
アドホックバッチ、ストアドプロシージャ、ユーザー定義関数など、さまざまな種類のTransact-SQLバッチのクエリプランは、プランキャッシュと呼ばれるメモリ領域にキャッシュされます。キャッシュされた各クエリプランは、プランハンドルと呼ばれる一意の識別子によって識別されます。このプランハンドルをsys.dm_exec_query_plan動的管理ビューで指定して、特定のTransact-SQLクエリまたはバッチの実行プランを取得できます。
はい、キャッシュ対象と見なされます。