7

関数の実行計画がSQLサーバーにキャッシュされているかどうかを理解するのに役立つ体はありますか?

このためのオンラインリソースはありますか?

4

3 に答える 3

10

受け入れられた回答は、主に「ユーザー定義関数」という用語に関して参照された引用が曖昧すぎるため、不正確/誤解を招くものです。

Microsoft SQL Server にはいくつかの異なる種類のユーザー定義関数があり、それらは異なる方法で扱われます。

  • マルチステートメント TVF:

    これらは、ストアド プロシージャのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「Compiled Plan」および「Proc」の で表示さsys.dm_exec_cached_planscacheobjtypeますobjtype。入力パラメーター値もプランと共に保存されるため、マルチステートメント TVF はパラメーター スニッフィングの問題の影響を受けます。

  • インライン TVF (iTVF):

    これらはビューのように扱われます。それらを実行するクエリには、それらの定義が組み込まれています。それらは、「解析ツリー」と「ビュー」の で表示さsys.dm_exec_cached_planscacheobjtypeますobjtype。入力パラメーター値はプランと共に保存されないため、インライン TVF はパラメーター スニッフィングの問題の影響を受けません。

  • スカラー UDF:

    これらは、ストアド プロシージャのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「Compiled Plan」および「Proc」の で表示さsys.dm_exec_cached_planscacheobjtypeますobjtype。入力パラメーター値もプランと共に保存されるため、スカラー UDF はパラメーター スニッフィングの問題の影響を受けます。また、上記の 2 種類の TVF とは異なり、通常のストアド プロシージャと同様に、実行時にorの代わりにWITH RECOMPILEオプションを使用して、実行プランの再コンパイルを強制できます。EXEC[UTE]SELECTSET

  • SQLCLR オブジェクト:

    これらは、クライアント/アプリ コードのように扱われます。それらを実行するクエリは、名前への参照のみを表示し、定義への参照は表示しません。それらは、「CLR Compiled Func」または「CLR Compiled Proc」、および「Proc」の で表示さsys.dm_exec_cached_planscacheobjtypeますobjtype。ただし、マルチステートメント TVF やスカラー UDF とは異なり、これらには定義がないため、クエリ プランが関連付けられていません。ただし、それらが実行するアドホック クエリ (ストアド プロシージャ コールではない) は、"コンパイル済みプラン" および "準備済み" で表示さsys.dm_exec_cached_planscacheobjtypeますobjtype。これらのアドホック クエリはいずれも、パラメーター化されている場合、準備されたプランと共に初期入力パラメーター値を格納する必要があるため、パラメーター スニッフィングの問題が発生する可能性があります。

オブジェクト キャッシュの詳細については、キャッシュ メカニズムに関する MSDN ページを参照してください。

于 2015-11-29T17:33:19.560 に答える
8

はい、実行プランのキャッシュに入れられます。

sys.dm_exec_query_plan DMVは、指定されたプランハンドルのプランを表示します。そこからの引用:

アドホックバッチ、ストアドプロシージャ、ユーザー定義関数など、さまざまな種類のTransact-SQLバッチのクエリプランは、プランキャッシュと呼ばれるメモリ領域にキャッシュされます。キャッシュされた各クエリプランは、プランハンドルと呼ばれる一意の識別子によって識別されます。このプランハンドルをsys.dm_exec_query_plan動的管理ビューで指定して、特定のTransact-SQLクエリまたはバッチの実行プランを取得できます。

于 2010-06-22T07:12:42.803 に答える
2

はい、キャッシュ対象と見なされます。

http://msdn.microsoft.com/en-us/library/ms181055.aspx

于 2010-06-22T06:57:03.987 に答える