Sorunun eti: gerçek saklı yordamlar geçici tablo önbelleğe almayı uygulayan tek mekanizma mıdır, yoksa sp_executeSQL
/ gibi sistem saklı yordamları sp_execute
da bunlardan mı yararlanır?
Ben bir DBA değilim, bu yüzden lütfen küçük kelimeler kullanın. Uygulamamız, profilcisine dan, ben üzerinden tüm SQL çalıştırmak bkz üzerinde hazır deyimleri gönderir sp_prepexec
çalışan ikisi için de bir sistem prosedür olan sp_prepare
ve sp_execute
. Yapmaya çalıştığım şey geçici tablo önbelleklemesinden yararlanıp faydalanmadığımı anlamak.
Bu kılavuzu davranışı incelemek için object_id () ile kullanıyorum
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
Daha sonra bu blog yazısında 3. nokta EXEC'in geçici tablo önbelleğe alma özelliğini kullanamayacağını, ancak sp_executeSQL'in şunları yapıp yapamayacağını gösterir: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
İstemciden gönderilen sorgumda basit bir geçici tablo oluşturdum.
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');
Profiler'de görebiliyorum:
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
Bundan da bir önbellek alıyorum. Ancak, geçici tablonun object_id bana değişiyor gibi görünüyor, bu geçici tablo gerçek bir saklı yordamda oluşturulan olup olmadığını görmek istiyorum davranış değildir. Ancak, ben aynı kodu aracılığıyla çalıştırmak sp_executeSQL
, ben de geçici tablonun object_id değiştiğini görüyorum. Bu sadece "gerçek" kullanıcı tarafından oluşturulan saklı yordamlar geçici tablo önbellek yararlanır inanıyorum yol açar.