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