sp_prepexec (sp_execute) vs. sp_executeSQL


8

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_executesfruttano 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_prepexecquale è una procedura di sistema sia per l'esecuzione sp_prepareche 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.

Risposte:


9

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_executesfruttano anche?

È necessaria una vera stored procedure ( CREATE PROCEDURE) per beneficiare della memorizzazione temporanea nella tabella. Ciò include le stored procedure temporanee ( #procname).

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ò farlo.

Si noti che EXECUTEviene utilizzato per l'esecuzione sp_executesql.

Test: ci sono molti modi per verificare se si sta verificando la memorizzazione nella cache. Alcuni di questi sono elencati nel mio articolo originale a cui si fa riferimento nella domanda, altri metodi sono mostrati nel mio post di follow-up, Spiegazione temporanea della cache delle tabelle , ad esempio:

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

Anche i TVP di input di stored procedure sono memorizzati nella cache e, a partire da SQL Server 2012 , possono anche essere memorizzati nella cache se utilizzati con sp_executesql. Vedi il post sul blog CSS collegato per i dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.