प्रश्न का मांस: वास्तविक संचित प्रक्रियाएं ही एकमात्र तंत्र हैं जो अस्थायी तालिका कैशिंग लागू करती हैं या सिस्टम संग्रहीत कार्यविधियाँ जैसे कि sp_executeSQL
/ sp_execute
भी उनका लाभ उठाती हैं?
मैं एक डीबीए नहीं हूं, इसलिए कृपया कम शब्दों का उपयोग करें। हमारा आवेदन तैयार किए गए बयानों को भेजता है, जो कि प्रोफाइलर से, मैं सभी एसक्यूएल को देखता हूं sp_prepexec
जिसके माध्यम से रनिंग sp_prepare
और दोनों के लिए एक सिस्टम प्रक्रिया है sp_execute
। अगर मैं अस्थायी तालिका कैशिंग से लाभान्वित हो रहा हूं, तो यह जानने की कोशिश करूंगा कि क्या करना है।
मैं व्यवहार की जांच करने के लिए object_id () के साथ इस गाइड का उपयोग कर रहा हूं
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
तो इस ब्लॉग पोस्ट पर बिंदु # 3 बताता है कि EXEC अस्थायी तालिका कैशिंग का उपयोग नहीं कर सकता है, लेकिन यह बताता है कि क्या sp_executeSQL कर सकते हैं: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec.ss- 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');
प्रोफाइलर में, मैं देख सकता हूँ:
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
मुझे इससे एक कैशहाइट भी मिलता है। हालाँकि, अस्थायी तालिका का ऑब्जेक्ट_ड मुझ पर बदलता हुआ प्रतीत होता है, जो कि ऐसा व्यवहार नहीं है जिसे मैं देखूंगा कि क्या यह अस्थायी तालिका वास्तविक संग्रहीत कार्यविधि में बनाई गई थी। हालाँकि, जब मैं उसी कोड को इसके माध्यम से चलाता हूं, तो मैं यह sp_executeSQL
भी देख रहा हूं कि अस्थायी तालिका का ऑब्जेक्ट_आईडी बदल गया है। यह मुझे विश्वास दिलाता है कि केवल "वास्तविक" उपयोगकर्ता निर्मित संग्रहीत प्रक्रियाएं टेम्परिंग टेबल कैशिंग का लाभ उठाती हैं।