A questão principal: os procedimentos armazenados reais são o único mecanismo que implementa o cache da tabela temporária ou os procedimentos armazenados do sistema como sp_executeSQL
/ sp_execute
também tiram vantagem deles?
Eu não sou um DBA, então use pequenas palavras. Nosso aplicativo envia instruções preparadas que, a partir do criador de perfil, eu vejo executar todo o SQL através do sp_prepexec
qual é um procedimento do sistema para execução sp_prepare
e sp_execute
. O que estou tentando fazer é descobrir se estou me beneficiando do cache da tabela temporária.
Eu tenho usado este guia com object_id () para examinar o comportamento
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
O ponto 3 desta publicação do blog sugere que o EXEC não pode usar o cache da tabela temporária, mas deixa de fora se o sp_executeSQL pode: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executaesql.aspx
Na minha consulta enviada através do cliente, criei uma tabela temporária simples.
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');
No profiler, eu posso ver:
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
Eu também recebo um cachehit com isso. No entanto, o object_id da tabela temporária parece estar mudando para mim, que não é o comportamento que verificaria se essa tabela temporária fosse criada em um procedimento armazenado real. No entanto, quando executo esse mesmo código sp_executeSQL
, também vejo que o object_id da tabela temporária foi alterado. Isso me leva a acreditar que apenas procedimentos armazenados criados por usuários "reais" se beneficiam do cache da tabela temporária.