sp_prepexec (sp_execute) बनाम sp_executeSQL


8

प्रश्न का मांस: वास्तविक संचित प्रक्रियाएं ही एकमात्र तंत्र हैं जो अस्थायी तालिका कैशिंग लागू करती हैं या सिस्टम संग्रहीत कार्यविधियाँ जैसे कि 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भी देख रहा हूं कि अस्थायी तालिका का ऑब्जेक्ट_आईडी बदल गया है। यह मुझे विश्वास दिलाता है कि केवल "वास्तविक" उपयोगकर्ता निर्मित संग्रहीत प्रक्रियाएं टेम्परिंग टेबल कैशिंग का लाभ उठाती हैं।

जवाबों:


9

क्या वास्तविक संग्रहीत कार्यविधियाँ ही एकमात्र तंत्र है जो अस्थायी सारणी कैशिंग को लागू करता है या सिस्टम संग्रहीत कार्यविधियाँ जैसे कि sp_executeSQL/ sp_executeउनका भी लाभ उठाता है?

CREATE PROCEDUREअस्थायी तालिका कैशिंग से लाभ उठाने के लिए आपको एक वास्तविक संग्रहीत प्रक्रिया ( ) की आवश्यकता होती है । इसमें अस्थायी संग्रहीत कार्यविधियाँ ( #procname) शामिल हैं।

इस ब्लॉग पोस्ट पर पॉइंट # 3 बताता है कि EXEC अस्थायी टेबल कैशिंग का उपयोग नहीं कर सकता है, लेकिन यह बताता है कि sp_executeSQL कर सकते हैं या नहीं।

नोटिस जिसे EXECUTEचलाने के लिए उपयोग किया जाता है sp_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। जानकारी के लिए लिंक सीएसएस ब्लॉग पोस्ट देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.