Najważniejsze pytanie: czy faktyczne procedury składowane są jedynym mechanizmem, który implementuje buforowanie tabeli temp, czy też systemowe procedury składowane, takie jak sp_executeSQL
/, sp_execute
również z nich korzystają?
Nie jestem DBA, więc proszę, użyj słów. Nasza aplikacja wysyła przygotowane instrukcje, które z profilera widzę, że uruchamiam wszystkie SQL, przez sp_prepexec
które jest to procedura systemowa do uruchamiania sp_prepare
i sp_execute
. Próbuję ustalić, czy korzystam z buforowania tabeli tymczasowej.
Korzystałem z tego przewodnika z object_id () do badania zachowania
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
Następnie punkt 3 tego postu na blogu sugeruje, że EXEC nie może używać buforowania tabeli tymczasowej, ale pomija, czy sp_executeSQL może: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
W moim zapytaniu przesłanym za pośrednictwem klienta utworzyłem prostą tabelę tymczasową.
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');
W profilerze widzę:
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
Dostaję także cachehit. Jednak obiekt_id tabeli temp wydaje się zmieniać na mnie, co nie jest zachowaniem, które widziałbym, gdyby tabela temp została utworzona w rzeczywistej procedurze składowanej. Jednak po uruchomieniu tego samego kodu sp_executeSQL
widzę również, że identyfikator_obiektu tabeli tymczasowej zmienił się. To prowadzi mnie do przekonania, że tylko „rzeczywiste” procedury przechowywane utworzone przez użytkownika korzystają z buforowania tabeli tymczasowej.