sp_prepexec(sp_execute)とsp_executeSQL


8

質問の要点:実際のストアドプロシージャは、一時テーブルキャッシュを実装する唯一のメカニズムですか、それとも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が変更されていることもわかります。これにより、ユーザーが作成した「実際の」ストアドプロシージャだけが一時テーブルキャッシュを利用できると思います。

回答:


9

実際のストアドプロシージャは、一時テーブルのキャッシュを実装する唯一のメカニズムですか、それともsp_executeSQL/ などのシステムストアドプロシージャsp_executeもそれらを利用しますか?

CREATE PROCEDURE一時テーブルのキャッシュを利用するには、実際のストアドプロシージャ()が必要です。これには、一時的なストアドプロシージャが含まれます(#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もキャッシュされます。SQLServer 2012以降では、これらもTVで使用できますsp_executesql。詳細については、リンクされたCSSブログの投稿を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.