sp_prepexec (sp_execute) vs. sp_executeSQL

8

Daging pertanyaan: apakah prosedur tersimpan aktual satu-satunya mekanisme yang menerapkan caching table temp atau melakukan prosedur penyimpanan sistem seperti sp_executeSQL/ sp_executejuga memanfaatkannya?

Saya bukan DBA, jadi silakan gunakan kata-kata kecil. Aplikasi kami mengirimkan pernyataan yang sudah disiapkan, dari profiler, saya melihat menjalankan semua SQL sp_prepexecyang merupakan prosedur sistem untuk menjalankan sp_preparedan sp_execute. Apa yang saya coba lakukan adalah mencari tahu apakah saya mendapat manfaat dari caching table temp.

Saya telah menggunakan panduan ini dengan object_id () untuk memeriksa perilaku

https://sqlkiwi.blogspot.com/2012/08/tentara-tables-in-stored-procedures.html

Kemudian titik # 3 pada posting blog ini menunjukkan bahwa EXEC tidak dapat menggunakan caching table temp, tetapi mengabaikan apakah sp_executeSQL dapat: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx

Dalam kueri saya yang dikirim melalui klien saya telah membuat tabel temp sederhana.

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

Di profiler, saya bisa melihat:

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

Saya juga mendapatkan cachehit dari ini. Namun, object_id dari tabel temp tampaknya berubah pada saya, yang bukan perilaku yang akan saya lihat jika tabel temp ini dibuat dalam prosedur tersimpan nyata. Namun, ketika saya menjalankan kode yang sama ini sp_executeSQL, saya juga melihat bahwa object_id dari tabel temp telah berubah. Hal ini membuat saya percaya bahwa hanya "nyata" yang dibuat prosedur tersimpan pengguna mengambil keuntungan dari caching table temp.

JT
sumber

Jawaban:

9

Apakah prosedur tersimpan aktual adalah satu-satunya mekanisme yang mengimplementasikan caching table temp atau melakukan prosedur penyimpanan sistem seperti sp_executeSQL/ sp_executejuga memanfaatkannya?

Anda memerlukan prosedur tersimpan nyata ( CREATE PROCEDURE) untuk mendapatkan manfaat dari caching tabel sementara. Ini termasuk prosedur tersimpan sementara ( #procname).

Poin # 3 pada posting blog ini menunjukkan bahwa EXEC tidak dapat menggunakan caching table temp, tetapi mengabaikan apakah sp_executeSQL bisa.

Perhatikan bahwa EXECUTEdigunakan untuk menjalankan sp_executesql.

Pengujian: Ada banyak cara untuk memeriksa apakah caching terjadi. Beberapa dari mereka tercantum dalam artikel asli saya yang dirujuk dalam pertanyaan, beberapa metode lagi ditampilkan dalam posting tindak lanjut saya, Penjelasan Caching Tabel Sementara , misalnya:

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

TVP input prosedur tersimpan juga di-cache, dan dimulai dengan SQL Server 2012 , ini juga bisa di-cache saat digunakan bersama sp_executesql. Lihat posting blog CSS yang ditautkan untuk detailnya.

Paul White 9
sumber