質問の要点:実際のストアドプロシージャは、一時テーブルキャッシュを実装する唯一のメカニズムですか、それともsp_executeSQL
/ などのシステムストアドプロシージャsp_execute
もそれらを利用しますか?
私はDBAではないので、少しだけ言葉を使ってください。私たちのアプリケーションは、プロファイラーから、sp_prepexec
実行sp_prepare
との両方のシステムプロシージャであるすべてのSQLを実行する準備済みステートメントを送信します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が変更されていることもわかります。これにより、ユーザーが作成した「実際の」ストアドプロシージャだけが一時テーブルキャッシュを利用できると思います。