El meollo de la pregunta: ¿son los procedimientos almacenados reales el único mecanismo que implementa el almacenamiento en caché de la tabla temporal o los procedimientos almacenados del sistema como sp_executeSQL
/ sp_execute
también se aprovechan de ellos?
No soy un DBA, así que por favor usa pequeñas palabras. Nuestra aplicación envía declaraciones sobre preparados que, desde el generador de perfiles, que veo en Ejecutar todo a través de SQL sp_prepexec
, que es un procedimiento del sistema, tanto para correr sp_prepare
y sp_execute
. Lo que estoy tratando de hacer es averiguar si me estoy beneficiando del almacenamiento en caché de la tabla temporal.
He estado usando esta guía con object_id () para examinar el comportamiento
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
Luego, el punto # 3 en esta publicación de blog sugiere que EXEC no puede usar el almacenamiento en caché de la tabla temporal, pero deja de lado si sp_executeSQL puede: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executetesql.aspx
En mi consulta enviada a través del cliente, he creado una tabla temporal simple.
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');
En profiler, puedo 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
También recibo un cachehit de esto. Sin embargo, el object_id de la tabla temporal parece estar cambiando en mí, que no es el comportamiento que vería si esta tabla temporal se creara en un procedimiento almacenado real. Sin embargo, cuando ejecuto este mismo código sp_executeSQL
, también veo que el object_id de la tabla temporal ha cambiado. Esto me lleva a creer que solo los procedimientos almacenados creados por usuarios "reales" aprovechan el almacenamiento en caché de la tabla temporal.