sp_prepexec (sp_execute) против sp_executeSQL

8

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

Я не администратор баз данных, поэтому, пожалуйста, используйте маленькие слова. Наше приложение посылает через подготовленные заявления , что из профилировщика, я вижу , запускать все 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- зр-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 временной таблицы, кажется, меняется на меня, что не является поведением, которое я видел бы, если бы эта временная таблица была создана в реальной хранимой процедуре. Однако, когда я запускаю этот же код sp_executeSQL, я также вижу, что object_id временной таблицы изменился. Это наводит меня на мысль, что только «настоящие» пользовательские хранимые процедуры используют преимущества кэширования временных таблиц.

JT
источник

Ответы:

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

TVP ввода хранимых процедур также кэшируются, и, начиная с SQL Server 2012 , они также могут кэшироваться при использовании с sp_executesql. См. Связанный пост блога CSS для деталей.

Пол Уайт 9
источник