कम से कम "संकलित योजनाओं" के संदर्भ में 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_objects। pages_in_bytesइन पंक्तियों के क्षेत्र अलग-अलग से मेल खाना चाहिए <QueryPlan>एक्सएमएल योजना के नोड्स।
संसाधन: