আপনি যখন " অ্যাডহক ওয়ার্কলোডের জন্য অনুকূলিতকরণ " বিকল্পটি চালু করেন, আপনি দ্বিতীয় বার পরিচালিত অ্যাড-হক প্রশ্নগুলি প্রথমটির মতোই ধীর করে দেবেন, কারণ আপনি একটি এক্সিকিউশন প্ল্যান সংকলন এবং একই ডেটা টানবেন ( এটি ক্যাশে ব্যতীত) প্রথম 2 বার।
এটি কোনও বড় বিষয় নাও হতে পারে তবে কোয়েরি পরীক্ষার সময় আপনি এটি লক্ষ্য করবেন।
তাই কি এখন এরকম ছাড়া এই অপশনটি চালু আছে ও 1-অফ অ্যাড-হক প্রশ্নের একটি ক্যাশে পরিপূর্ণ?
ক্যাচিং ম্যানেজমেন্ট অ্যালগরিদম:
এই অপ্টিমাইজেশান বৈশিষ্ট্যটি চালু হওয়ার সাথে সাথে ক্যাচিং পরিচালনা অ্যালগরিদমও আপডেট হয়েছিল।
কিম্বারলি ট্রিপের নিবন্ধে এই অ্যালগরিদম পরিবর্তন সম্পর্কে ক্যালেন ডেলানির পোস্টেরও উল্লেখ রয়েছে ।
তিনি এটি সেরা ব্যাখ্যা করেছেন:
পরিবর্তনটি আসলে একটি পরিকল্পনার ক্যাশে আকারের গণনা করে যেখানে এসকিউএল সার্ভার স্বীকৃতি দেয় যে মেমরির চাপ আছে, এবং এটি ক্যাশে থেকে পরিকল্পনাগুলি সরিয়ে শুরু করবে। অপসারণ করার পরিকল্পনাগুলি হ'ল সস্তার পরিকল্পনাগুলি যা আবার ব্যবহার করা হয়নি এবং এটি একটি দুর্দান্ত জিনিস।
এর অর্থ হ'ল এই সংবেদনশীল ওয়ান-টাইমার পরিকল্পনাগুলি যখন আপনার সংস্থানগুলি মুক্ত করার দরকার হবে তখন প্রথম হবে।
সুতরাং এখন প্রশ্ন হয়ে ওঠে:
" কেন আমরা প্রয়োজন 'তদর্থক চাপ জন্য অপ্টিমাইজ করুন' যখন SQL সার্ভার যখন প্রয়োজন অব্যবহৃত পরিকল্পনা সরানোর যত্ন নেয় না? "
করবো, যেটা আমার উত্তর, যদি আপনি নিয়মিত ডাইনামিক-SQL অ স্থিতিমাপ বিজ্ঞাপনের গাদাগাদা উৎপাদিত একজন গুলি-টন আছে -হোক জিজ্ঞাসা, তারপরে এটি এই বৈশিষ্ট্যটি চালু করার জন্য সঠিক ধারণা তৈরি করে।
আপনি সিস্টেমের সংস্থানগুলিতে স্ট্রেন চাপানো এড়াতে চান, যেমন আপনি সর্বোচ্চ ক্যাশে মেমরির জায়গাটি ব্যবহার করার পরে ক্যাশেড / পরিকল্পনা / ডেটা অপসারণকে বাধ্য করে।
কখন এটি চালু করতে হবে তা আমি কীভাবে জানব?
আপনি বর্তমানে কতগুলি অ্যাড-হক পরিকল্পনা রেখেছেন এবং কতগুলি ডিস্ক-স্পেস তারা খাচ্ছে তা দেখানোর জন্য এখানে একটি প্রশ্নের উত্তর লিখেছি (ফলাফলগুলি দিনব্যাপী পরিবর্তিত হবে - সুতরাং ভারী বোঝার সময় এটি পরীক্ষা করুন):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
ফলাফল:
আমি এটি বলব না, " যখন আপনার এক্স এমবি রয়েছে " বা " যদি আপনার বিজ্ঞাপনের X% একক ব্যবহার হয় " এটি চালু করতে।
এটি স্প্রোকস, ট্রিগারস, ভিউ বা প্যারামিটারাইজড / প্রস্তুত এসকিউএলকে প্রভাবিত করে না - কেবলমাত্র অ্যাড-হকের অনুসন্ধানগুলি qu
আমার ব্যক্তিগত সুপারিশটি হ'ল কেবল আপনার প্রোড পরিবেশে চালু করা, তবে এটি আপনার দেব পরিবেশে ছেড়ে দেওয়া বিবেচনা করুন।
আমি এই বলতে শুধুমাত্র দেব জন্য, কারণ তুমি একটি ক্যোয়ারী করে একটি মিনিট বা তার বেশি রান লাগে নিখুঁত করছি, তাহলে আপনি না এটা 3 বার চালানোর আগে আপনি দেখতে পারেন কিভাবে দ্রুত এটা দিয়ে এটা দিয়ে ক্যাশে যাব চাই - যে একক সময় আপনি এটি সর্বোত্তম অপ্টিমাইজেশন নকশা সন্ধান করতে সম্পাদনা করুন।
যদি আপনার কাজটি সারাদিন এটি করার সাথে জড়িত না থাকে তবে বাদাম হয়ে যান এবং আপনার ডিবিএকে এটি যে কোনও জায়গায় চালু করতে বলুন।