sp_prepexec (sp_execute) กับ sp_executeSQL


8

เนื้อของคำถาม: เป็นขั้นตอนการจัดเก็บจริงกลไกเดียวที่ดำเนินการแคชตารางชั่วคราวหรือทำขั้นตอนการจัดเก็บระบบเช่น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 มีการเปลี่ยนแปลง สิ่งนี้ทำให้ฉันเชื่อว่าเฉพาะผู้ใช้ "ของจริง" ที่สร้างขึ้นในขั้นตอนการจัดเก็บใช้ประโยชน์จากการแคชตารางชั่วคราว

คำตอบ:


9

ขั้นตอนการจัดเก็บที่เกิดขึ้นจริงเป็นเพียงกลไกเดียวที่ใช้การแคชตารางชั่วคราวหรือทำขั้นตอนการจัดเก็บระบบเช่นsp_executeSQL/ sp_executeใช้ประโยชน์จากพวกเขาหรือไม่?

คุณต้องใช้ขั้นตอนการจัดเก็บจริง ( CREATE PROCEDURE) เพื่อรับประโยชน์จากการแคชตารางชั่วคราว ซึ่งรวมถึงขั้นตอนการจัดเก็บชั่วคราว ( #procname)

จุด # 3 ในโพสต์บล็อกนี้แสดงให้เห็นว่า EXEC ไม่สามารถใช้แคชตารางชั่วคราว แต่ออกว่า sp_executeSQL สามารถ

ขอให้สังเกตว่ามีการใช้ในการทำงานEXECUTEsp_executesql

การทดสอบ: มีหลายวิธีในการตรวจสอบว่าแคชเกิดขึ้นหรือไม่ บางส่วนของพวกเขามีการระบุไว้ในบทความต้นฉบับของฉันอ้างอิงในคำถามวิธีการบางอย่างเพิ่มเติมจะแสดงในโพสต์ติดตามของฉันอธิบายการแคชตารางชั่วคราวอธิบาย :

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

เก็บไว้ TVPs ป้อนข้อมูลขั้นตอนนี้ยังเก็บไว้ชั่วคราวและเริ่มต้นด้วย SQL Server 2012 , sp_executesqlเหล่านี้ยังสามารถเก็บไว้เมื่อใช้กับ ดูโพสต์บล็อก CSS ที่ลิงก์สำหรับรายละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.