Суть питання: чи є фактично збережені процедури єдиним механізмом, який реалізує кешування темп-таблиць, чи застосовують системні збережені процедури, такі як 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 змінився. Це приводить мене до думки, що лише керування процедурами, створеними користувачем, створеними користувачем, користуються перевагою кешування таблиць темп.