sp_prepexec (sp_execute) vs. sp_executeSQL

8

Das Kernstück der Frage: Sind tatsächlich gespeicherte Prozeduren der einzige Mechanismus, der das Zwischenspeichern von temporären Tabellen implementiert, oder nutzen gespeicherte Systemprozeduren wie sp_executeSQL/ sp_executeauch diese?

Ich bin kein DBA, bitte verwenden Sie kleine Wörter. Unsere Anwendung sendet über vorbereitete Anweisungen , die vom Profiler, ich laufe sehen Sie alle SQL über sp_prepexecdie eine Systemprozedur sowohl für laufende sp_prepareund sp_execute. Ich versuche herauszufinden, ob ich vom temporären Zwischenspeichern von Tabellen profitiere.

Ich habe dieses Handbuch mit object_id () verwendet, um das Verhalten zu untersuchen

https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html

Dann schlägt Punkt 3 in diesem Blog-Beitrag vor, dass EXEC kein temporäres Tabellen-Caching verwenden kann, lässt jedoch aus, ob sp_executeSQL dies kann: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx

In meiner über den Client gesendeten Anfrage habe ich eine einfache temporäre Tabelle erstellt.

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');

Im Profiler kann ich sehen:

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

Ich bekomme auch einen Cachehit davon. Die object_id der temporären Tabelle scheint sich jedoch bei mir zu ändern. Dies ist nicht das Verhalten, das ich sehen würde, wenn diese temporäre Tabelle in einer realen gespeicherten Prozedur erstellt würde. Wenn ich jedoch denselben Code durchführe sp_executeSQL, sehe ich auch, dass sich die object_id der temporären Tabelle geändert hat. Dies lässt mich glauben, dass nur "echte" vom Benutzer erstellte gespeicherte Prozeduren das temporäre Zwischenspeichern von Tabellen nutzen.

JT
quelle

Antworten:

9

Sind tatsächlich gespeicherte Prozeduren der einzige Mechanismus, der das Zwischenspeichern von temporären Tabellen implementiert, oder nutzen gespeicherte Systemprozeduren wie sp_executeSQL/ sp_executeauch diese?

Sie benötigen eine echte gespeicherte Prozedur ( CREATE PROCEDURE), um vom temporären Zwischenspeichern von Tabellen zu profitieren. Dies schließt temporär gespeicherte Prozeduren ( #procname) ein.

Punkt 3 in diesem Blog-Beitrag legt nahe, dass EXEC kein temporäres Tabellen-Caching verwenden kann, lässt jedoch aus, ob sp_executeSQL dies kann.

Beachten Sie, dass EXECUTEzum Ausführen verwendet wird sp_executesql.

Testen: Es gibt viele Möglichkeiten, um zu überprüfen, ob Caching stattfindet. Einige davon sind in meinem ursprünglichen Artikel aufgeführt, auf den in der Frage verwiesen wird, andere Methoden sind in meinem Folgebeitrag "Temporäres Tabellen-Caching erklärt" aufgeführt , zum Beispiel:

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';

Eingangs-TVPs für gespeicherte Prozeduren werden ebenfalls zwischengespeichert. Ab SQL Server 2012 können diese bei Verwendung mit auch zwischengespeichert werden sp_executesql. Weitere Informationen finden Sie im verknüpften CSS-Blogbeitrag.

Paul White 9
quelle