0

SQLサーバーは関数の実行プランをキャッシュしますか?

4

2 に答える 2

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 を提供しません。

于 2009-10-13T17:44:17.963 に答える
2

はい、rexem の Tibor リンクと Andrew の回答を参照してください。

ただし...単純なテーブル値関数は、とにかく外側のクエリにネスト/展開されます。ビューのように。そして私の答え(リンク付き)はこちら

つまり、次のタイプです。

CREATE FUNC dbo.Foo ()
RETURNS TABLE
AS
RETURN (SELECT ...)
GO
于 2009-10-13T18:20:15.433 に答える