कैश आकार और आरक्षित मेमोरी की योजना बनाएं


18

वास्तविक निष्पादन योजना सहित एक क्वेरी चलाते समय, रूट ऑपरेटर ( SELECT) मुझे बताता है कि कैश्ड प्लान का आकार 32KB है।

एक क्वेरी जो मिलती है sys.dm_exec_cached_plansऔर sys.dm_os_memory_objectsसवाल में योजना को देखते हुए कहते हैं के लिए है कि मूल्यों pages_in_bytesऔर max_pages_in_bytes32768 (32 केबी) है, जो कैश की गई योजना आकार से मेल खाता है।

मुझे समझ में नहीं आ रहा है कि sys.dm_exec_cached_plans.size_in_bytes49152 (48KB) का मूल्य क्या है। मैंने इन सभी स्तंभों पर BOL पढ़ा है, और विशेष रूप से size_in_bytesजो कहता है:

" कैश ऑब्जेक्ट द्वारा खपत बाइट्स की संख्या। "

मैं उस अंतिम पहेली को जगह में नहीं ला सकता, यह समझने के लिए कि इसका वास्तव में क्या मतलब है।

मुझे पता है कि सभी ऑपरेटरों (सॉर्ट और हैश के लिए उपयोग किए जाने वाले अतिरिक्त मेमोरी अनुदान के बारे में बात नहीं कर रहे हैं) को निश्चित मेमोरी की कुछ मात्रा की आवश्यकता होती है, राज्य को स्टोर करने, गणना करने आदि के लिए, जिसे कैश में अनुकूलित योजना के साथ संग्रहीत किया जाता है, लेकिन कहां?

तो, मेरे सवाल हैं:

  • size_in_bytesवास्तव में क्या मतलब है
  • यह "कैश्ड प्लान आकार" से अधिक मूल्य क्यों है?
  • सभी ऑपरेटरों / पुनरावृत्तियों के लिए मेमोरी की निश्चित मात्रा कहाँ रखी गई है, क्या यह "कैश्ड प्लान साइज़" (मेरे उदाहरण में 32 केबी) या कहीं और है?

मुझे पता है कि वे अलग-अलग कार्यों के साथ अलग-अलग डीएमवी हैं, लेकिन वे संबंधित हैं। संकलित (कैश्ड) कॉलम में sys.dm_exec_cached_plansशामिल sys.dm_os_memory_objectsहोने की योजना है memory_object_address। कारण मैं यहाँ सवाल पोस्ट, यह है कि मैं इस पर मदद के लिए पूछ रहा हूँ, समझ कैसे DMVs और उनके स्तंभों की व्याख्या करने के लिए।

यदि size_in_bytesकैश की गई योजना का आकार है, तो SQL सर्वर वास्तविक निष्पादन योजना में एक और मूल्य क्यों कहता है?

नई क्वेरी, नई संख्या:

  • वास्तविक योजना
    • कैश्ड प्लान का आकार 16KB
    • CompileMemory 96KB
  • DMVs:
    • sys.dm_exec_cached_plans.size_in_bytes 24kb
    • sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB।

इसके अलावा, ध्यान दें कि इस क्वेरी को सॉर्ट और हैश ऑपरेशन के लिए किसी भी अतिरिक्त मेमोरी अनुदान की आवश्यकता नहीं है।

Microsoft SQL Server 2012 - 11.0.5343.0 (X64)

जवाबों:


12

कम से कम "संकलित योजनाओं" के संदर्भ में DMV का size_in_bytesक्षेत्र sys.dm_exec_cached_plans, XML योजना में नोड की CachedPlanSizeविशेषता से बड़ा है, QueryPlanक्योंकि एक संकलित योजना एक क्वेरी योजना के समान नहीं है। एक संकलित योजना में कई मेमोरी ऑब्जेक्ट शामिल हैं, जिसका संयुक्त आकार size_in_bytesफ़ील्ड के बराबर है । तो, " कैश ऑब्जेक्ट द्वारा खपत बाइट्स की संख्या " का विवरण जो आपको दस्तावेज़ में मिला है, वह सटीक है; यह सिर्फ इतना है कि DMV के नाम को दिए गए "कैश ऑब्जेक्ट" से क्या मतलब है, इसे गलत तरीके से समझना आसान है और "प्लान" शब्द के कई अर्थ हैं।

एक संकलित योजना एक कंटेनर है जो क्वेरी बैच (यानी न केवल एक बयान) से संबंधित जानकारी के विभिन्न टुकड़ों को रखती है , उन टुकड़ों में से एक (या अधिक) क्वेरी प्लान (s) है। संकलित योजनाओं में MEMOBJ_COMPILE_ADHOC की एक शीर्ष-स्तरीय मेमोरी ऑब्जेक्ट है जो उस पंक्ति में है sys.dm_os_memory_objectsजो memory_object_addressदोनों DMV में फ़ील्ड के माध्यम से जुड़ी हुई है । इस मेमोरी ऑब्जेक्ट में प्रतीक तालिका, पैरामीटर संग्रह, संबंधित वस्तुओं के लिंक, एक्सेसर कैश, टीडीएस मेटाडेटा कैश, और संभवतः कुछ अन्य आइटम शामिल हैं। संकलित योजनाएँ सत्र / उपयोगकर्ताओं के बीच साझा की जाती हैं जो समान सत्र सेटिंग्स के साथ एक ही बैच को निष्पादित कर रहे हैं। हालाँकि, कुछ संबंधित वस्तुओं को सत्र / उपयोगकर्ताओं के बीच साझा नहीं किया जाता है।

संकलित योजनाओं में एक या अधिक आश्रित वस्तुएं होती हैं जिन्हें डीएमएफ में plan_handle(इन sys.dm_exec_cached_plans) पास करके पाया जा सकता है sys.dm_exec_cached_plan_dependent_objects। दो प्रकार की आश्रित वस्तुएं हैं: निष्पादन योग्य योजना (मेमोरी ऑब्जेक्ट = MEMOBJ_EXECUTE ) और कर्सर (मेमोरी ऑब्जेक्ट = MEMOBJ_CURSOREXEC )। प्रत्येक कर्सर में 0 या अधिक कर्सर ऑब्जेक्ट्स होंगे। एक या अधिक निष्पादन योग्य योजना ऑब्जेक्ट भी होंगे, प्रत्येक उपयोगकर्ता जो उस बैच को निष्पादित कर रहे हैं, इसलिए निष्पादन योग्य योजनाएं नहीं हैंउपयोगकर्ताओं के बीच साझा किया गया। निष्पादन योग्य योजनाओं में रन-टाइम पैरामीटर और स्थानीय परिवर्तनशील जानकारी होती है, रन-टाइम स्थिति जैसे कि वर्तमान में निष्पादित स्टेटमेंट, रन-टाइम पर बनाई गई वस्तुओं के लिए ऑब्जेक्ट आईडी (मेरा मानना ​​है कि यह टेबल वेरिएबल्स, टेम्पररी टेबल्स, अस्थायी स्थैतिक प्रक्रियाओं, आदि को संदर्भित करता है) , और संभवतः अन्य आइटम।

मल्टी-स्टेटमेंट बैच के भीतर प्रत्येक स्टेटमेंट एक संकलित स्टेटमेंट (मेमोरी ऑब्जेक्ट = MEMOBJ_STATEMENT ) के भीतर समाहित है । pages_in_bytes1024 द्वारा विभाजित प्रत्येक संकलित विवरण (यानी ) का आकार एक्सएमएल योजना में नोड्स के CachedPlanSize="xx"मूल्यों से मेल खाना चाहिए <QueryPlan>। संकलित विवरणों में अक्सर एक (संभवतः अधिक?) संबद्ध रनटाइम क्वेरी योजना (मेमोरी ऑब्जेक्ट = MEMOBJ_XSTMM ) होगी। अंत में, प्रत्येक रनटाइम क्वेरी प्लान के लिए जो एक क्वेरी है, वहां एक संबंधित क्वेरी एक्ज़िक्यूट कंसेप्ट (मेमोरी ऑब्जेक्ट = MEMOBJ_QUERYEXECCNTXTFORSE ) होना चाहिए ।

संकलित विवरणों के संबंध में, एकल-स्टेटमेंट बैच में अलग संकलित कथन (यानी MEMOBJ_STATEMENT ) या अलग रनटाइम क्वेरी प्लान (यानी MEMOBJ_XSTMT ) ऑब्जेक्ट नहीं हैं। उन वस्तुओं में से प्रत्येक के लिए मूल्य मुख्य संकलित योजना ऑब्जेक्ट (यानी MEMOBJ_COMPILE_ADHOC ) में संग्रहीत किया जाएगा , और उस स्थिति में, pages_in_bytes1024 द्वारा विभाजित मुख्य वस्तु के लिए मूल्य XML योजना CachedPlanSizeके <QueryPlan>नोड में आकार से मेल खाना चाहिए । हालांकि, बहु-बयान बैचों में वे मूल्य समान नहीं होंगे।


size_in_bytesमूल्य में प्रविष्टियों संक्षेप द्वारा प्राप्त किया जा सकता sys.dm_os_memory_objects(आइटम बोल्ड में ऊपर बताया गया है) DMV, सभी से संबंधित dm_os_memory_objects.page_allocator_addressहै कि संकलित योजना के लिए। सही मान प्राप्त करने की चाल पहले एक विशेष संकलित योजना के लिए memory_object_addressसे प्राप्त करना है sys.dm_exec_cached_plans, फिर उसी फ़ील्ड के sys.dm_os_memory_objectsआधार पर इसी MEMOBJ_COMPILE_ADHOC पंक्ति को प्राप्त करने के लिए उपयोग करें memory_object_address। फिर, उस पंक्ति के लिए page_allocator_addressमान को पकड़ो sys.dm_os_memory_objects, और इसका उपयोग सभी पंक्तियों sys.dm_os_memory_objectsको एक ही page_allocator_addressमान से खींचने के लिए करें । (कृपया ध्यान दें कि यह तकनीक अन्य कैश्ड ऑब्जेक्ट प्रकारों के लिए काम नहीं करती है: पार्स ट्री , एक्सटेंडेड प्रोक , सीएलआर संकलित प्रोक , और सीएलआर संकलित फंक।)

memory_object_addressसे प्राप्त मूल्य का उपयोग करके sys.dm_exec_cached_plans, आप निम्न क्वेरी के माध्यम से संकलित योजना के सभी घटकों को देख सकते हैं:

DECLARE @CompiledPlanAddress VARBINARY(8) = 0x00000001DC4A4060;

SELECT obj.memory_object_address, obj.pages_in_bytes, obj.type
FROM   sys.dm_os_memory_objects obj
WHERE  obj.page_allocator_address = (
                               SELECT planobj.page_allocator_address
                               FROM   sys.dm_os_memory_objects planobj
                               WHERE  planobj.memory_object_address = @CompiledPlanAddress
                              )
ORDER BY obj.[type], obj.pages_in_bytes;

नीचे दी sys.dm_exec_cached_plansगई क्वेरी क्वेरी प्लान के साथ-साथ प्रत्येक बैच के लिए संकलित योजनाओं के सभी सूचियों को सूचीबद्ध करती है । सीधे ऊपर की क्वेरी को MemoryObjectsक्षेत्र के रूप में XML के माध्यम से नीचे क्वेरी में शामिल किया गया है :

SELECT cplan.bucketid,
       cplan.pool_id,
       cplan.refcounts,
       cplan.usecounts,
       cplan.size_in_bytes,
       cplan.memory_object_address,
       cplan.cacheobjtype,
       cplan.objtype,
       cplan.plan_handle,
       '---' AS [---],
       qrypln.[query_plan],
       sqltxt.[text],
       '---' AS [---],
       planobj.pages_in_bytes,
       planobj.pages_in_bytes / 1024 AS [BaseSingleStatementPlanKB],
       '===' AS [===],
       cplan.size_in_bytes AS [TotalPlanBytes],
       bytes.AllocatedBytes,
       (SELECT CONVERT(VARCHAR(30), obj.memory_object_address, 1)
               AS [memory_object_address], obj.pages_in_bytes, obj.[type]
               --,obj.page_size_in_bytes
        FROM   sys.dm_os_memory_objects obj
        WHERE  obj.page_allocator_address = planobj.page_allocator_address
        FOR XML RAW(N'object'), ROOT(N'memory_objects'), TYPE) AS [MemoryObjects]
FROM   sys.dm_exec_cached_plans cplan
OUTER APPLY sys.dm_exec_sql_text(cplan.[plan_handle]) sqltxt
OUTER APPLY sys.dm_exec_query_plan(cplan.[plan_handle]) qrypln
INNER JOIN sys.dm_os_memory_objects planobj
        ON planobj.memory_object_address = cplan.memory_object_address
OUTER APPLY (SELECT SUM(domo.[pages_in_bytes]) AS [AllocatedBytes]
             FROM   sys.dm_os_memory_objects domo
             WHERE  domo.page_allocator_address = planobj.page_allocator_address) bytes
WHERE  cplan.parent_plan_handle IS NULL
AND    cplan.cacheobjtype IN (N'Compiled Plan', N'Compiled Plan Stub')
--AND cplan.plan_handle = 0x06000D0031CD572910529CE001000000xxxxxxxx
ORDER BY cplan.objtype, cplan.plan_handle;

कृपया ध्यान दें कि:

  • TotalPlanBytesफ़ील्ड , फ़ील्ड का केवल एक पुनः कथन है sys.dm_exec_cached_plans.size_in_bytes,
  • AllocatedBytesक्षेत्र संबंधित स्मृति वस्तुओं है कि आम तौर से मेल खाता है का योग है TotalPlanBytes(यानी size_in_bytes)
  • AllocatedBytesक्षेत्र कभी कभी से अधिक हो जाएगा TotalPlanBytes(यानी size_in_bytes) स्मृति की खपत निष्पादन के दौरान बढ़ रही है की वजह से। ऐसा प्रतीत होता है कि ज्यादातर पुनर्संयोजन के कारण होता है (जो कि usecountsक्षेत्र को दिखाने के साथ स्पष्ट होना चाहिए 1)
  • BaseSingleStatementPlanKBक्षेत्र चाहिए से मेल CachedPlanSizeकी विशेषता QueryPlanXML के नोड, लेकिन केवल किसी एक क्वेरी बैच का उपयोग करते समय।
  • एकाधिक क्वेरी वाले बैचों के लिए, प्रत्येक क्वेरी के लिए एक के रूप MEMOBJ_STATEMENTमें चिह्नित पंक्तियाँ होनी चाहिए sys.dm_os_memory_objectspages_in_bytesइन पंक्तियों के क्षेत्र अलग-अलग से मेल खाना चाहिए <QueryPlan>एक्सएमएल योजना के नोड्स।

संसाधन:

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