কারণ size_in_bytes
মাঠে sys.dm_exec_cached_plans
না DMV, "সংকলিত প্ল্যান" পদ অন্তত চেয়ে বড় CachedPlanSize
অ্যাট্রিবিউট QueryPlan
কারণ একটি সংকলিত পরিকল্পনা একটি ক্যোয়ারী পরিকল্পনা হিসাবে একই জিনিস না এক্সএমএল পরিকল্পনার নোড হয়। একটি সংকলিত পরিকল্পনা একাধিক মেমোরি অবজেক্ট নিয়ে গঠিত, যার সম্মিলিত আকার size_in_bytes
ক্ষেত্রের সাথে সমান । সুতরাং, আপনি ডকুমেন্টেশনে খুঁজে পেয়েছেন " ক্যাশে অবজেক্ট দ্বারা গ্রাহিত বাইটের সংখ্যা " এর বিবরণ সঠিক; এটি কেবলমাত্র ডিএমভির নাম অনুসারে "ক্যাশে অবজেক্ট" বলতে কী বোঝানো হয়েছে এবং "পরিকল্পনা" শব্দটির একাধিক অর্থ রয়েছে তা ভুল ব্যাখ্যা করা সহজ।
একটি সংকলিত পরিকল্পনা হ'ল একটি ধারক যা ক্যোয়ারী ব্যাচের সাথে সম্পর্কিত বিভিন্ন ধরণের তথ্যের টুকরো ধারণ করে (যেমন কেবল একটি বিবৃতি নয়), সেই টুকরাগুলির মধ্যে একটি (বা আরও) কোয়েরি প্ল্যান (গুলি)। সংকলিত পরিকল্পনাগুলিতে একটি উচ্চ স্তরের মেমোবিজে_সিএমপিএল_এইচওসি -র একটি স্মৃতি অবজেক্ট রয়েছে যা উভয় ডিএমভি - sys.dm_os_memory_objects
র memory_object_address
ক্ষেত্রেই ক্ষেত্রের মাধ্যমে সংযুক্ত একটি সারি । এই মেমোরি অবজেক্টে প্রতীক টেবিল, প্যারামিটার সংগ্রহ, সম্পর্কিত বস্তুর লিঙ্ক, অ্যাকসেসর ক্যাশে, টিডিএস মেটাডেটা ক্যাশে এবং সম্ভবত কিছু অন্যান্য আইটেম রয়েছে। সংকলিত পরিকল্পনাগুলি সেশন / ব্যবহারকারীদের মধ্যে ভাগ করা হয় যা একই স্যাশন সেটিংসের সাথে একই ব্যাচটি সম্পাদন করে exec তবে কিছু সম্পর্কিত অবজেক্ট সেশন / ব্যবহারকারীর মধ্যে ভাগ করা যায় না ।
সংকলিত পরিকল্পনাগুলিতেও এক বা একাধিক নির্ভরশীল অবজেক্ট থাকে যা ডিএমএফ- এ plan_handle
(ইন sys.dm_exec_cached_plans
) পাশ করে খুঁজে পাওয়া যায় sys.dm_exec_cached_plan_dependent_objects
। দুটি ধরণের নির্ভরশীল অবজেক্ট রয়েছে: এক্সিকিউটেবল প্ল্যান (মেমোরি অবজেক্ট = MEMOBJ_EXECUTE ) এবং কার্সার (মেমোরি অবজেক্ট = MEMOBJ_CURSOREXEC )। 0 বা ততোধিক কার্সার অবজেক্ট থাকবে, প্রতিটি কার্সর অনুসারে একটি করে। এছাড়াও এক বা একাধিক এক্সিকিউটেবল প্ল্যান অবজেক্ট থাকবে, প্রতিটি ব্যাচের একই ব্যাচের এক্সিকিউটিভকারী প্রতিটি ব্যবহারকারী , সুতরাং এক্সিকিউটেবল প্ল্যানস নয়ব্যবহারকারীদের মধ্যে ভাগ করা। এক্সিকিউটেবল প্ল্যানসে রান-টাইম প্যারামিটার এবং স্থানীয় ভেরিয়েবল তথ্য, রান-টাইম স্টেট যেমন বর্তমানে সম্পাদনকারী বিবৃতি, রান-টাইমে তৈরি আইটেমগুলির জন্য অবজেক্ট আইডি (আমি ধরে নিই এটি সারণী ভেরিয়েবলস, অস্থায়ী টেবিলগুলি, অস্থায়ী সঞ্চিত প্রক্রিয়া ইত্যাদির উল্লেখ করে) , এবং সম্ভবত অন্যান্য আইটেম।
একটি বহু-বিবৃতি ব্যাচের প্রতিটি বিবৃতি একটি সংকলিত বিবৃতি (মেমোরি অবজেক্ট = মেমোবিজেপিটিএএমটি ) এর মধ্যে থাকে। প্রতিটি সঙ্কলিত বিবৃতি (যেমন pages_in_bytes
) 1024 দ্বারা বিভক্ত আকারের এক্সএমএল পরিকল্পনার নোডগুলির CachedPlanSize="xx"
মানগুলির সাথে মেলে <QueryPlan>
। সংকলিত বিবৃতিগুলিতে প্রায়শই একটি (সম্ভবত আরও?) সম্পর্কিত রানটাইম ক্যোয়ারী প্ল্যানস (মেমোরি অবজেক্ট = MEMOBJ_XSTMT ) থাকবে। অবশেষে, প্রতিটি রানটাইম ক্যোয়ারী প্ল্যানের জন্য যা ক্যোয়ারী, সেখানে একটি সম্পর্কিত ক্যোয়ারি এক্সিকিউশন কনটেক্সট (মেমোরি অবজেক্ট = MEMOBJ_QUERYEXECCNTXTFORSE ) থাকা উচিত।
সংকলিত বিবৃতি সম্পর্কিত, একক বিবৃতি ব্যাচে পৃথক সংকলিত বিবৃতি (যেমন MEMOBJ_STATEMENT ) বা পৃথক রানটাইম ক্যোয়ারী প্ল্যান (যেমন MEMOBJ_XSTMT ) অবজেক্ট নেই। এই সমস্ত বস্তুর প্রত্যেকটির মান মূল সংকলিত প্ল্যান অবজেক্টে (যেমন MEMOBJ_COMPILE_ADHOC ) সংরক্ষণ করা হবে এবং সেই ক্ষেত্রে, pages_in_bytes
1024 দ্বারা বিভক্ত মূল বিষয়টির মানটি XML পরিকল্পনার নোডের সাথে CachedPlanSize
আকারের সাথে মিলবে <QueryPlan>
। মাল্টি-স্টেটমেন্ট ব্যাচে এই মানগুলি সমান হবে না।
size_in_bytes
মান এন্ট্রি summing দ্বারা আহরিত হতে পারে sys.dm_os_memory_objects
(আইটেম গাঢ় উপরে উল্লিখিত) না DMV, সমস্ত দ্বারা সম্পর্কিত dm_os_memory_objects.page_allocator_address
যে সংকলিত পরিকল্পনা জন্য। সঠিক মান পেয়ে কৌতুক প্রথম পেতে হয় memory_object_address
থেকে sys.dm_exec_cached_plans
একটি নির্দিষ্ট সংকলিত পরিকল্পনা জন্য, তারপর ব্যবহার সংশ্লিষ্ট পেতে MEMOBJ_COMPILE_ADHOC থেকে সারি sys.dm_os_memory_objects
তার উপর ভিত্তি করে 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
ক্ষেত্র হিসাবে এক্সএমএলের মাধ্যমে নীচে থাকা প্রশ্নের সাথে সংযুক্ত করা হয়েছে :
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
অ্যাট্রিবিউট QueryPlan
XML- এর নোড কিন্তু শুধুমাত্র একটি একক ক্যোয়ারী ব্যাচ ব্যবহার করে।
- একাধিক প্রশ্নের সঙ্গে ব্যাচ জন্য, সারি হিসাবে চিহ্নিত করা উচিত
MEMOBJ_STATEMENT
মধ্যে sys.dm_os_memory_objects
প্রতিটি জিজ্ঞাসার জন্য এক। pages_in_bytes
এই সারি জন্য ক্ষেত্রের পৃথক সুসংগত হওয়া <QueryPlan>
এক্সএমএল পরিকল্পনার নোড।
সম্পদ: