sp_prepexec (sp_execute) vs. sp_executeSQL

8

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_executetambé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_prepexecqual é um procedimento do sistema para execução sp_preparee 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.

JT
fonte

Respostas:

9

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_executetambém tiram vantagem deles?

Você precisa de um procedimento armazenado real ( CREATE PROCEDURE) para se beneficiar do cache temporário da tabela. Isso inclui procedimentos armazenados temporários ( #procname).

O ponto 3 desta publicação no blog sugere que o EXEC não pode usar o cache da tabela temporária, mas deixa de fora se o sp_executeSQL pode.

Observe que EXECUTEé usado para executar sp_executesql.

Teste: existem várias maneiras de verificar se o cache está ocorrendo. Alguns deles estão listados no meu artigo original mencionado na pergunta, outros métodos são mostrados no meu post de acompanhamento, Temporary Table Caching Explained , por exemplo:

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

As TVPs de entrada de procedimento armazenado também são armazenadas em cache e, a partir do SQL Server 2012 , elas também podem ser armazenadas em cache quando usadas sp_executesql. Veja a postagem do blog CSS vinculada para obter detalhes.

Paul White 9
fonte