ক্যাশের আকার এবং সংরক্ষিত মেমরির পরিকল্পনা করুন


18

প্রকৃত সম্পাদন পরিকল্পনা সহ কোয়েরি চালানোর সময়, রুট অপারেটর ( SELECT) আমাকে বলে যে ক্যাশেড প্ল্যানের আকার 32KB।

একটি ক্যোয়ারী যা যোগদান করে sys.dm_exec_cached_plansএবং sys.dm_os_memory_objectsপ্রশ্নে পরিকল্পনার দিকে তাকিয়ে বলে যে মানগুলি 32768 (32 কেবি) হয় pages_in_bytesএবং max_pages_in_bytesএটি ক্যাশেড পরিকল্পনার আকারের সাথে মেলে।

আমি যা বুঝতে পারি না তা হ'ল মানটি sys.dm_exec_cached_plans.size_in_bytesযা 49152 (48KB) এর অর্থ। আমি এই সমস্ত কলামে বিওএল পড়েছি এবং বিশেষত size_in_bytesযা বলে:

" ক্যাশে অবজেক্ট দ্বারা গ্রাহিত বাইটের সংখ্যা " "

আমি ধাঁধাটির শেষ বিটটি ঠিক জায়গায় পেতে পারি না, এর সত্যতা কী তা বোঝার জন্য।

আমি জানি যে সমস্ত অপারেটর (বাছাই এবং হ্যাশগুলির জন্য ব্যবহৃত অতিরিক্ত মেমরি অনুদানের বিষয়ে কথা বলছে না) কিছু পরিমাণ স্থির মেমরির প্রয়োজন, স্টোর সঞ্চয় করতে, গণনা করা ইত্যাদি, যা ক্যাশে অনুকূলিত পরিকল্পনার সাথে সঞ্চিত হয়, তবে কোথায়?

সুতরাং, আমার প্রশ্নগুলি হ'ল:

  • আসলে size_in_bytesকি মানে
  • কেন এটি "ক্যাশেড পরিকল্পনার আকার" এর চেয়ে বেশি মূল্য?
  • সমস্ত অপারেটর / পুনরাবৃত্তিকারীদের জন্য স্থির পরিমাণের মেমোরি কোথায় সংরক্ষিত আছে, এটি কি "ক্যাশেড প্ল্যান সাইজ" (আমার উদাহরণে 32 কেবি) বা অন্য কোথাও রয়েছে?

আমি জানি তারা বিভিন্ন ফাংশন সহ বিভিন্ন ডিএমভি, তবে তারা সম্পর্কিত। সংকলিত (ক্যাশেড) পরিকল্পনা কলামে sys.dm_exec_cached_plansযোগদান করে sys.dm_os_memory_objectson memory_object_addressআমি এখানে প্রশ্নগুলি পোস্ট করার কারণটি হ'ল আমি কীভাবে ডিএমভিগুলি এবং তাদের কলামগুলি ব্যাখ্যা করতে পারি তা বুঝতে এই বিষয়ে সহায়তা চাইছি asking

যদি size_in_bytesক্যাশেড প্ল্যানের আকার হয় তবে এসকিউএল সার্ভার কেন প্রকৃত বাস্তবায়ন পরিকল্পনার জন্য অন্য একটি মান বলে?

নতুন প্রশ্ন, নতুন সংখ্যা:

  • আসল পরিকল্পনা
    • ক্যাশেড প্ল্যান সাইজ 16 কেবি
    • সংকলন স্মৃতি 96 কেবি
  • DMVs:
    • sys.dm_exec_cached_plans.size_in_bytes 24KB
    • sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB।

এছাড়াও, নোট করুন যে এই কোয়েরিতে বাছাই এবং হ্যাশ ক্রিয়াকলাপগুলির জন্য কোনও অতিরিক্ত মেমরি অনুদানের প্রয়োজন হয় না।

মাইক্রোসফ্ট এসকিউএল সার্ভার 2012 - 11.0.5343.0 (এক্স 64)

উত্তর:


12

কারণ size_in_bytesমাঠে sys.dm_exec_cached_plansনা DMV, "সংকলিত প্ল্যান" পদ অন্তত চেয়ে বড় CachedPlanSizeঅ্যাট্রিবিউট QueryPlanকারণ একটি সংকলিত পরিকল্পনা একটি ক্যোয়ারী পরিকল্পনা হিসাবে একই জিনিস না এক্সএমএল পরিকল্পনার নোড হয়। একটি সংকলিত পরিকল্পনা একাধিক মেমোরি অবজেক্ট নিয়ে গঠিত, যার সম্মিলিত আকার size_in_bytesক্ষেত্রের সাথে সমান । সুতরাং, আপনি ডকুমেন্টেশনে খুঁজে পেয়েছেন " ক্যাশে অবজেক্ট দ্বারা গ্রাহিত বাইটের সংখ্যা " এর বিবরণ সঠিক; এটি কেবলমাত্র ডিএমভির নাম অনুসারে "ক্যাশে অবজেক্ট" বলতে কী বোঝানো হয়েছে এবং "পরিকল্পনা" শব্দটির একাধিক অর্থ রয়েছে তা ভুল ব্যাখ্যা করা সহজ।

একটি সংকলিত পরিকল্পনা হ'ল একটি ধারক যা ক্যোয়ারী ব্যাচের সাথে সম্পর্কিত বিভিন্ন ধরণের তথ্যের টুকরো ধারণ করে (যেমন কেবল একটি বিবৃতি নয়), সেই টুকরাগুলির মধ্যে একটি (বা আরও) কোয়েরি প্ল্যান (গুলি)। সংকলিত পরিকল্পনাগুলিতে একটি উচ্চ স্তরের মেমোবিজে_সিএমপিএল_এইচওসি -র একটি স্মৃতি অবজেক্ট রয়েছে যা উভয় ডিএমভি - sys.dm_os_memory_objectsmemory_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_bytes1024 দ্বারা বিভক্ত মূল বিষয়টির মানটি 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_objectspage_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অ্যাট্রিবিউট QueryPlanXML- এর নোড কিন্তু শুধুমাত্র একটি একক ক্যোয়ারী ব্যাচ ব্যবহার করে।
  • একাধিক প্রশ্নের সঙ্গে ব্যাচ জন্য, সারি হিসাবে চিহ্নিত করা উচিত MEMOBJ_STATEMENTমধ্যে sys.dm_os_memory_objectsপ্রতিটি জিজ্ঞাসার জন্য এক। pages_in_bytesএই সারি জন্য ক্ষেত্রের পৃথক সুসংগত হওয়া <QueryPlan>এক্সএমএল পরিকল্পনার নোড।

সম্পদ:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.