La questione principale: le attuali procedure memorizzate sono l'unico meccanismo che implementa la memorizzazione nella cache delle tabelle temporanee o le procedure memorizzate dal sistema come sp_executeSQL
/ ne sp_execute
sfruttano anche?
Non sono un DBA, quindi per favore usa piccole parole. La nostra applicazione invia istruzioni preparate che, dal profiler, vedo eseguire tutto SQL attraverso il sp_prepexec
quale è una procedura di sistema sia per l'esecuzione sp_prepare
che per sp_execute
. Quello che sto cercando di fare è capire se sto beneficiando della memorizzazione nella cache delle tabelle temporanee.
Ho usato questa guida con object_id () per esaminare il comportamento
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
Quindi il punto 3 in questo post del blog suggerisce che EXEC non può utilizzare la memorizzazione nella cache delle tabelle temporanee, ma esclude se sp_executeSQL può: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
Nella mia query inviata tramite il client ho creato una semplice tabella temporanea.
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');
Nel profiler, posso vedere:
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
Ho anche ricevuto una cachehit da questo. Tuttavia, object_id della tabella temporanea sembra cambiare su di me, il che non è il comportamento che vedrei se questa tabella temporanea fosse creata in una vera procedura memorizzata. Tuttavia, quando eseguo lo stesso codice sp_executeSQL
, vedo anche che object_id della tabella temporanea è cambiato. Questo mi porta a credere che solo le procedure memorizzate create dall'utente "reale" traggano vantaggio dalla memorizzazione nella cache delle tabelle temporanee.