sp_prepexec (sp_execute) ve sp_executeSQL karşılaştırması


8

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_executeda 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_prepareve 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.

Yanıtlar:


9

Gerçek saklı yordamlar geçici tablo önbelleğe almayı uygulayan tek mekanizma mıdır, yoksa sp_executeSQL/ gibi sistem saklı yordamları sp_executeda bunlardan mı yararlanır?

CREATE PROCEDUREGeçici tablo önbelleğe alma özelliğinden yararlanmak için gerçek bir saklı yordam ( ) gerekir. Bu geçici saklı yordamları ( #procname) içerir.

Bu blog gönderisindeki 3. nokta, EXEC'in geçici tablo önbelleğe alma özelliğini kullanamayacağını, ancak sp_executeSQL'in yapıp yapamayacağını gösterir.

Bildirim EXECUTEçalıştırmak için kullanılır sp_executesql.

Test etme: Önbelleğe almanın olup olmadığını kontrol etmenin birçok yolu vardır. Bunlardan bazıları soruda atıfta bulunulan orijinal makalemde listeleniyor, takip yazımda, Geçici Tablo Önbelleğe Alma Açıklamasında daha fazla yöntem gösteriliyor :

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

Saklı yordam giriş TVP'leri de önbelleğe alınır ve SQL Server 2012 ile başlayarak , bunlar kullanıldığında da önbelleğe alınabilir sp_executesql. Ayrıntılar için bağlantılı CSS blog yayınına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.