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_execute
auch 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_prepexec
die eine Systemprozedur sowohl für laufende sp_prepare
und 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.