Daging pertanyaan: apakah prosedur tersimpan aktual satu-satunya mekanisme yang menerapkan caching table temp atau melakukan prosedur penyimpanan sistem seperti sp_executeSQL
/ sp_execute
juga 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_prepexec
yang merupakan prosedur sistem untuk menjalankan sp_prepare
dan 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.