sp_prepexec (sp_execute) frente a sp_executeSQL


8

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_executetambié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_preparey 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.

Respuestas:


9

¿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_executetambién se aprovechan de ellos?

Necesita un procedimiento almacenado real ( CREATE PROCEDURE) para beneficiarse del almacenamiento en caché temporal de la tabla. Esto incluye procedimientos almacenados temporales ( #procname).

El punto n. ° 3 de esta publicación de blog sugiere que EXEC no puede usar el almacenamiento en caché de la tabla temporal, pero omite si sp_executeSQL sí.

Tenga en cuenta que EXECUTEse utiliza para ejecutar sp_executesql.

Pruebas: hay muchas formas de comprobar si se está produciendo el almacenamiento en caché. Algunos de ellos se enumeran en mi artículo original al que se hace referencia en la pregunta, otros métodos se muestran en mi publicación de seguimiento, Explicación temporal del almacenamiento en caché de tablas , por ejemplo:

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

Los TVP de entrada de procedimiento almacenado también se almacenan en caché y, a partir de SQL Server 2012 , también se pueden almacenar en caché cuando se usan con sp_executesql. Vea la publicación del blog CSS vinculada para más detalles.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.