質問の要点:実際のストアドプロシージャは一時テーブルのキャッシュを実装する唯一のメカニズムですか、それともsp_executeSQL
/sp_execute
などのシステムストアドプロシージャもそれらを利用しますか?
私はDBAではないので、少しだけ言葉を使ってください。私たちのアプリケーションは、プロファイラーからsp_prepexec
を介してすべてのSQLを実行する準備されたステートメントを送信します。これは、sp_prepare
とsp_execute
の両方を実行するためのシステムプロシージャです。私がやろうとしているのは、一時テーブルのキャッシュから利益を得ているかどうかを判断することです。
このガイドをobject_id()と一緒に使用して動作を調べています
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
次に、このブログ投稿のポイント#3は、EXECは一時テーブルキャッシュを使用できないことを示していますが、sp_executeSQLが次のことができるかどうかは省略しています http://blogs.msdn.com/b/turgays/archive/2013/09/18/ exec-vs-sp-executesql.aspx
クライアント経由で送信されたクエリでは、単純な一時テーブルを作成しました。
DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement
SELECT 1 AS id
INTO #tmp
SELECT OBJECT_ID('tempdb..#tmp');
プロファイラーで、私は見ることができます:
declare @p1 int
set @p1=NULL
exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1
SELECT 1 as id
into #tmp
select Object_id(''tempdb..#tmp'');
DROP TABLE #tmp;',1
select @p1
これからもキャッシュヒットします。ただし、一時テーブルのobject_idが変化しているように見えます。これは、この一時テーブルが実際のストアドプロシージャで作成された場合の動作とは異なります。ただし、sp_executeSQL
を使用して同じコードを実行すると、一時テーブルのobject_idが変更されていることもわかります。これにより、「実際の」ユーザーが作成したストアドプロシージャのみが一時テーブルのキャッシュを利用すると信じています。
実際のストアドプロシージャは、一時テーブルキャッシュを実装する唯一のメカニズムですか、それとも
sp_executeSQL
/sp_execute
などのシステムストアドプロシージャもそれらを利用しますか?
一時テーブルのキャッシュを利用するには、実際のストアドプロシージャ(CREATE PROCEDURE
)が必要です。これには、temporaryストアドプロシージャ(#procname
)が含まれます。
このブログ投稿のポイント#3は、EXECが一時テーブルのキャッシュを使用できないことを示していますが、sp_executeSQLが使用できるかどうかは省略しています。
EXECUTE
がsp_executesql
の実行に使用されていることに注意してください。
テスト:キャッシュが行われているかどうかを確認する方法はたくさんあります。それらのいくつかは質問で参照された私の元の記事にリストされており、いくつかのメソッドは私のフォローアップ投稿 Temporary Table Caching Explained に示されています。次に例を示します。
SELECT
DOMCC.name,
DOMCC.pages_kb,
DOMCC.pages_in_use_kb,
DOMCC.entries_count,
DOMCC.entries_in_use_count
FROM sys.dm_os_memory_cache_counters AS DOMCC
WHERE DOMCC.[type] = N'CACHESTORE_TEMPTABLES';
ストアドプロシージャの入力TVPもキャッシュされます SQL Server 2012以降 。これらはsp_executesql
と一緒に使用するとキャッシュされます。詳細については、リンクされたCSSブログの投稿を参照してください。