sp_prepexec (sp_execute) проти sp_executeSQL


8

Суть питання: чи є фактично збережені процедури єдиним механізмом, який реалізує кешування темп-таблиць, чи застосовують системні збережені процедури, такі як sp_executeSQL/ sp_executeтакож користуються ними?

Я не DBA, тому будь ласка, використовуйте мало слів. Наш додаток надсилає підготовлені висловлювання про те, що, з профілера, я бачу запуск усіх SQL, через sp_prepexecякі є системною процедурою і для запуску, sp_prepareі для sp_execute. Що я намагаюся зробити, це зрозуміти, чи отримую я користь від кешування таблиць темп.

Я використовував цей посібник з object_id (), щоб вивчити поведінку

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

Тоді пункт 3 у цій публікації в блозі говорить про те, що EXEC не може використовувати кешування таблиць темп, але залишає, чи може sp_executeSQL: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-Executesql.aspx

У своєму запиті, надісланому через клієнта, я створив просту таблицю темпів.

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

У профілері я бачу:

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

Я також отримую кешхіт від цього. Однак, здається, що object_id таблиці temp змінюється на мене, що не є поведінкою, яку я бачив би, якби ця таблиця temp була створена в реальній збереженій процедурі. Однак, коли я запускаю цей самий код sp_executeSQL, я також бачу, що object_id таблиці temp змінився. Це приводить мене до думки, що лише керування процедурами, створеними користувачем, створеними користувачем, користуються перевагою кешування таблиць темп.

Відповіді:


9

Чи є фактично збережені процедури єдиним механізмом, який реалізує кешування таблиць тимчасових таблиць, або ж системні збережені процедури, такі як sp_executeSQL/ sp_executeтакож використовують їх?

Вам потрібна реальна збережена процедура ( CREATE PROCEDURE), щоб скористатися тимчасовим кешуванням таблиці. Сюди входять тимчасові зберігаються процедури ( #procname).

Пункт №3 цієї публікації в блозі говорить про те, що EXEC не може використовувати кешування таблиці темп, але залишає, чи може sp_executeSQL.

Зверніть увагу, що EXECUTEвикористовується для запуску sp_executesql.

Тестування: Є багато способів перевірити, чи відбувається кешування. Деякі з них перераховані в моїй оригінальній статті, на яку посилається питання, деякі інші методи показані в моєму подальшому дописі, пояснюється тимчасове кешування таблиці , наприклад:

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

Також зберігаються кешовані сховища вхідних процедур для вхідних процедур, і починаючи з SQL Server 2012 , вони також можуть кешуватися при використанні з sp_executesql. Докладніше див. У пов’язаному дописі блогу CSS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.