sp_prepexec (sp_execute) contre sp_executeSQL


8

La chair de la question: les procédures stockées réelles sont-elles le seul mécanisme qui implémente la mise en cache de la table temporaire ou les procédures stockées système telles que sp_executeSQL/ en sp_executetirent-elles également avantage?

Je ne suis pas un DBA, veuillez donc utiliser de petits mots. Notre application envoie des instructions préparées que, à partir du profileur, je vois exécuter tout SQL à travers sp_prepexeclequel est une procédure système pour l'exécution sp_prepareet sp_execute. Ce que j'essaie de faire est de savoir si je profite de la mise en cache de la table temporaire.

J'ai utilisé ce guide avec object_id () pour examiner le comportement

https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html

Ensuite, le point # 3 de ce billet de blog suggère qu'EXEC ne peut pas utiliser la mise en cache de la table temporaire, mais ignore si sp_executeSQL peut: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx

Dans ma requête envoyée via le client, j'ai créé une simple table temporaire.

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

Dans profiler, je peux voir:

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

J'obtiens également un cachehit de cela. Cependant, l'id_objet de la table temporaire semble changer sur moi, ce qui n'est pas le comportement que je verrais si cette table temporaire a été créée dans une véritable procédure stockée. Cependant, lorsque j'exécute ce même code sp_executeSQL, je constate également que l'objet_id de la table temporaire a changé. Cela m'amène à croire que seules les procédures stockées créées par l'utilisateur "réelles" tirent parti de la mise en cache de la table temporaire.

Réponses:


9

Les procédures stockées réelles sont-elles le seul mécanisme qui implémente la mise en cache de la table temporaire ou les procédures stockées système telles que sp_executeSQL/ en sp_executetirent-elles également profit?

Vous avez besoin d'une véritable procédure stockée ( CREATE PROCEDURE) pour bénéficier de la mise en cache temporaire des tables. Cela inclut les procédures stockées temporaires ( #procname).

Le point # 3 de ce billet de blog suggère qu'EXEC ne peut pas utiliser la mise en cache de la table temporaire, mais ignore si sp_executeSQL le peut.

Notez que EXECUTEc'est utilisé pour s'exécuter sp_executesql.

Test: Il existe de nombreuses façons de vérifier si la mise en cache se produit. Certaines d'entre elles sont répertoriées dans mon article d'origine référencé dans la question, d'autres méthodes sont présentées dans mon article de suivi, Mise en cache de table temporaire expliquée , par exemple:

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

Les TVP d'entrée de procédure stockée sont également mis en cache, et à partir de SQL Server 2012 , ceux-ci peuvent également être mis en cache lorsqu'ils sont utilisés avec sp_executesql. Voir l'article de blog CSS lié pour plus de détails.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.