เนื้อของคำถาม: เป็นขั้นตอนการจัดเก็บจริงกลไกเดียวที่ดำเนินการแคชตารางชั่วคราวหรือทำขั้นตอนการจัดเก็บระบบเช่นsp_executeSQL
/ sp_execute
ยังใช้ประโยชน์จากพวกเขา?
ฉันไม่ใช่ DBA ดังนั้นโปรดใช้คำพูดเล็กน้อย โปรแกรมของเราส่งงบเตรียมมากกว่าว่าจาก Profiler ที่ฉันเห็นเรียกใช้ SQL ทั้งหมดที่ผ่านsp_prepexec
ซึ่งเป็นขั้นตอนของระบบสำหรับทั้งทำงานและsp_prepare
sp_execute
สิ่งที่ฉันพยายามทำคือหาว่าฉันได้รับประโยชน์จากการแคชตารางชั่วคราว
ฉันใช้คู่มือนี้กับ object_id () เพื่อตรวจสอบพฤติกรรม
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
แล้วชี้ # 3 โพสต์บล็อกนี้แสดงให้เห็นว่า EXEC ไม่สามารถใช้แคชตาราง temp แต่ใบออกว่า sp_executesql สามารถ: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- SP-executesql.aspx
ในแบบสอบถามของฉันส่งผ่านทางลูกค้าฉันได้สร้างตารางชั่วคราว
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 ฉันสามารถดู:
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
ฉันยังได้รับแคชจากนี้ อย่างไรก็ตาม object_id ของตาราง temp นั้นดูเหมือนว่าจะเปลี่ยนแปลงกับฉันซึ่งไม่ใช่พฤติกรรมที่ฉันจะดูว่าตาราง temp นี้ถูกสร้างขึ้นในขั้นตอนการจัดเก็บจริง อย่างไรก็ตามเมื่อฉันเรียกใช้รหัสเดียวกันนี้ผ่านsp_executeSQL
ฉันยังเห็นว่า object_id ของตาราง temp มีการเปลี่ยนแปลง สิ่งนี้ทำให้ฉันเชื่อว่าเฉพาะผู้ใช้ "ของจริง" ที่สร้างขึ้นในขั้นตอนการจัดเก็บใช้ประโยชน์จากการแคชตารางชั่วคราว