SQLサーバーは関数の実行プランをキャッシュしますか?
2 に答える
dmvによれば、はい、http: //msdn.microsoft.com/en-us/library/ms189747.aspxですが、確認するにはテストを実行する必要があります。
出力のオブジェクト ID は、「このクエリ プランのオブジェクト (ストアド プロシージャやユーザー定義関数など) の ID」です。
テストしたところ、別のプラン キャッシュ エントリを取得しているように見えます。
テスト スクリプト:
create function foo (@a int)
returns int
as
begin
return @a
end
作成された最も基本的な関数。
-- clear out the plan cache
dbcc freeproccache
dbcc dropcleanbuffers
go
-- use the function
select dbo.foo(5)
go
-- inspect the plan cache
select * from sys.dm_exec_cached_plans
go
プラン キャッシュには 4 つのエントリがあり、objtype = Proc としてリストされているエントリは関数プラン キャッシュであり、ハンドルを取得して開きます。
select * from sys.dm_exec_query_plan(<insertplanhandlehere>)
テストの最初のアドホックは実際のクエリで、2 番目のアドホックはプラン キャッシュを要求するクエリでした。そのため、発行されたアドホック クエリとは異なる proc タイプで別のエントリを確実に受け取りました。プラン ハンドルも異なり、プラン ハンドルを使用して抽出すると、元の関数にオブジェクト ID が提供されますが、アドホック クエリはオブジェクト ID を提供しません。
はい、rexem の Tibor リンクと Andrew の回答を参照してください。
ただし...単純なテーブル値関数は、とにかく外側のクエリにネスト/展開されます。ビューのように。そして私の答え(リンク付き)はこちら
つまり、次のタイプです。
CREATE FUNC dbo.Foo ()
RETURNS TABLE
AS
RETURN (SELECT ...)
GO