আপনি কিভাবে মৃত্যুদন্ড পরিকল্পনা পড়তে? ডান থেকে বামে, বাম থেকে ডানে, বা খরচ চেক আউট করে? অথবা ইনডেক্স স্ক্যান, টেবিল স্ক্যান, এবং লুকআপের মত বস্তু সম্পর্কে কি? এই ব্লগটি আলোচনা করে কিভাবে একটি Microsoft® SQL সার্ভার এক্সিকিউশন প্ল্যান পড়তে হয়।
পরিচয়
যদিও SQL সার্ভার সাধারণত একটি ভাল প্ল্যান তৈরি করে, কখনও কখনও এটির প্ল্যানগুলিকে যাচাই করা এবং খারাপগুলি ঠিক করা বুদ্ধিমানের কাজ নয়৷
আপনি SQL সার্ভারে একটি আনুমানিক এক্সিকিউশন প্ল্যান এবং একটি প্রকৃত গ্রাফিক্যাল এক্সিকিউশন প্ল্যান পেতে পারেন। ctrl M কমান্ড ব্যবহার করে এই পরিকল্পনাগুলি তৈরি করুন৷ অথবা ctrl L অথবা আইকন ব্যবহার করে, যা SQL সার্ভার ম্যানেজমেন্ট স্টুডিও (SSMS) এর স্ট্যান্ডার্ড টুল বারে এক্সিকিউট আইকনের ডানদিকে রাখা হয়। SQL সার্ভারের অন্য ধরনের পরিকল্পনা রয়েছে, কিন্তু সেই পরিকল্পনাগুলি এই পোস্টে কভার করা হয়নি৷
৷আনুমানিক এবং বাস্তব বাস্তবায়ন পরিকল্পনা
দুই ধরনের এক্সিকিউশন প্ল্যান আছে:
-
আনুমানিক এক্সিকিউশন প্ল্যান :আনুমানিক পরিকল্পনাগুলি ডেটা পাওয়ার জন্য SQL সার্ভারের যে কাজটি সম্পাদন করবে বলে আশা করা হয় তার একটি অনুমান প্রদান করে৷
-
প্রকৃত বাস্তবায়ন পরিকল্পনা :ট্রানস্যাক্ট-এসকিউএল ক্যোয়ারী বা ব্যাচগুলি সম্পাদিত হওয়ার পর প্রকৃত এক্সিকিউশন প্ল্যান তৈরি করা হয়। এই কারণে, একটি বাস্তব এক্সিকিউশন প্ল্যানে রানটাইম তথ্য থাকে, যেমন প্রকৃত রিসোর্স ব্যবহার মেট্রিক্স এবং যেকোনো রানটাইম সতর্কতা।
ডেটা প্রক্রিয়াকরণ
আপনি কি একই প্রশ্নের জন্য আনুমানিক পরিকল্পনা এবং প্রকৃত পরিকল্পনার মধ্যে পার্থক্য লক্ষ্য করেছেন? বেশিরভাগ সময় এটি একই হবে, তবে পরিসংখ্যান পরিবর্তন, স্কিমা-সম্পর্কিত পরিবর্তন বা ডেটাতে পরিবর্তনের কারণে এটি আলাদা হতে পারে। সমস্যা সমাধানের সময় আপনার সর্বদা প্রকৃত এক্সিকিউশন প্ল্যান চেক করা উচিত।
প্রকৃত বিন্দু সনাক্ত করতে কার্যকরী পরিকল্পনা সঠিকভাবে পড়ুন। খরচের চেয়ে ডেটা প্রবাহ দেখে শুরু করুন। যৌক্তিক বা শারীরিক পাঠ সম্পর্কে চিন্তা করবেন না। ইনপুট/আউটপুট (I/O) ক্রিয়াকলাপগুলির সংখ্যা হ্রাস করা গুরুত্বপূর্ণ৷ একজন ডাটাবেস প্রশাসক (DBA) হিসাবে, আপনি জানেন যে স্টোরেজ অ্যাক্সেস করা হার্ডওয়্যার সংস্থানগুলির মধ্যে সবচেয়ে ধীর, তাই আপনার সেই ক্রিয়াকলাপটি হ্রাস করার চেষ্টা করা উচিত৷ সুতরাং আপনি কিভাবে পরিসংখ্যান অন্বেষণ করবেন, এবং কার্যকরী পরিকল্পনা এটি দেখায়? হ্যাঁ, এটা করে! ডান-থেকে-বাম নির্দেশকের উপর মাউস ঘোরানোর মাধ্যমে দিকনির্দেশের রেখাগুলি দেখুন। এটি রেকর্ডের সংখ্যা এবং ডেটা আকার প্রদর্শন করে। অপারেশন দ্বারা প্রত্যাবর্তিত ডেটা ভলিউমের উপর ভিত্তি করে প্রতিটি লাইন মোটা বা পাতলা হয় যা নিম্নলিখিত চিত্র দ্বারা দেখানো হয়েছে:
আপনার যদি অনেকগুলি অবজেক্ট থাকে তবে প্রতিটি অপারেশন দ্বারা প্রক্রিয়াকৃত ডেটার পরিমাণের একটি ওভারভিউ পেতে আপনার আরও ভাল উপায় প্রয়োজন। সেন্ট্রিওয়ান প্ল্যান এক্সপ্লোরার ডাউনলোড করুন এবং একটি ওভারভিউ পাওয়ার সহজ উপায়ের জন্য এই টুলটি ব্যবহার করে প্ল্যানটি দেখুন৷
আপনি আপনার সিস্টেমে SentryOne ডাউনলোড এবং কনফিগার করার পরে, এটির সাথে এক্সিকিউশন প্ল্যানটি খুলুন। SentryOne-এর অনেক দর্শন এবং বর্ণনা রয়েছে, যা আপনি আপনার প্রয়োজন অনুযায়ী ব্যবহার করতে পারেন। ডেটা প্রসেসিং ভিউ পেতে, Data size in MB
নির্বাচন করে ভিউ পরিবর্তন করুন নিম্নলিখিত ছবিতে দেখানো বিকল্প। আপনার লক্ষ্য হল সামগ্রিক ডেটা প্রসেসিং কমানোর সুযোগ খোঁজা।
আপনার যদি I/O চাপ কমাতে হয়, তাহলে আপনি SET STATISTICS IO ON
দেখতে পারেন কোয়েরির জন্য I/O ব্যবহারের সামগ্রিক ধারণা পেতে T-SQL মান। বার্তায় ফলাফল পরিবর্তন দেখতে SSMS-এ ক্যোয়ারী এক্সিকিউশনের আগে আপনার এটি সেট করা উচিত ফলাফল-এ ট্যাব প্যানেল এটি নিম্নলিখিত ফলাফলের অনুরূপ হওয়া উচিত:
(356 row(s) affected)
Table 'Table3'. Scan count 1, logical reads 5, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0,
lob read-ahead reads 0.
লজিক্যাল রিড 5 ফলাফল দেখায় যে SQL সার্ভার মেমরি থেকে ডেটা পেতে 40 KB (5 * 8 KB) পৃষ্ঠা পড়ে। ক্যোয়ারী অপ্টিমাইজ করার সময়, লজিক্যাল রিডগুলিকে উপেক্ষা করবেন না কারণ এটি লাইভ সার্ভারে শারীরিক এবং যৌক্তিক হতে পারে। আপনি কখনই জানেন না যে পৃষ্ঠাগুলি আপনি উল্লেখ করছেন সেগুলি মেমরিতে বা ডিস্কে রয়েছে৷ লক্ষ্য হওয়া উচিত ক্রমবর্ধমান পঠিত ক্রিয়াকলাপগুলির সংখ্যা হ্রাস করা৷
আনুমানিক বনাম প্রকৃত পরিকল্পনা
আসল প্ল্যান তৈরি হওয়ার পর, এক্সিকিউশন প্ল্যানের যেকোনো অপারেশন বা লজিক্যাল ইউনিটের উপর আপনার মাউস ঘোরান। ক্লাস্টারড ইনডেক্স সিক বা স্ক্যান এর মতো শারীরিক ক্রিয়াকলাপগুলির ধরন দেখতে নিম্নলিখিত চিত্রটি পড়ুন ফলাফল মৃত্যুদণ্ডের সংখ্যা এবং সারির প্রকৃত এবং আনুমানিক সংখ্যা সন্ধান করুন। পৃথক ক্রিয়াকলাপের খরচের দিকে তাকানো এড়িয়ে চলুন কারণ এটি পুরানো হার্ডওয়্যারের উপর ভিত্তি করে একটি অনুমান ইনসেকেন্ড এবং সঠিক বিবরণ প্রদান নাও করতে পারে। নিচের ছবিতে, ক্লাস্টারড ইনডেক্স সিক অপারেটর 100টি রেকর্ড পেতে এক সময় নির্বাহ করেছে, এবং এসকিউএল অনুমান করে 356টি রেকর্ড। পার্থক্যটি পুরানো পরিসংখ্যান বা অনুসন্ধান কর্মক্ষমতার কারণে হতে পারে।
এক্সিকিউশন পুনরাবৃত্তি
নিম্নলিখিত চিত্রটি একটি রেকর্ড পেতে একটি ক্লাস্টার সূচকে 1154121 বার মৃত্যুদণ্ডের আনুমানিক সংখ্যা দেখায়। সেটা তাৎপর্যপূর্ণ। যদিও অপারেটরের খরচ কম, এবং আমরা এটিকে উপেক্ষা করতে পারতাম, পরিবর্তে উচ্চ খরচ সহ অন্যান্য ক্রিয়াকলাপগুলির দিকে তাকালে, এটি একটি ব্যয়বহুল পছন্দ হিসাবে প্রমাণিত হতে পারে। ক্লাস্টার সূচক থাকা সত্ত্বেও এই ধরনের অপারেশনগুলি কোয়েরি কর্মক্ষমতার উপর উচ্চ প্রভাব ফেলে। সারি আইডি (আরআইডি) লুকআপগুলি হিপের জন্য একটি অনুরূপ অপারেশন।
অস্থায়ী ডাটাবেস
রেকর্ডের আনুমানিক এবং প্রকৃত সংখ্যার মধ্যে পার্থক্য হল আরেকটি বিষয় যা আপনার বিবেচনা করা উচিত। একটি ভুল অনুমান একটি সীমিত মেমরি বরাদ্দ থাকার একটি প্রশ্ন হতে পারে. যখন এটি ঘটে, এটি কাজগুলি সম্পন্ন করতে একটি অস্থায়ী ডাটাবেস (টেম্পডিবি) ব্যবহার করে। এসকিউএল সার্ভার দ্বারা অপারেটর বা পরিকল্পনার ভুল পছন্দের ফলে নিম্নোক্ত ছবিতে দেখানো হয়েছে, যেমনটি ধীর গতির অপারেশন এবং অনুসন্ধানের নিষ্কাশন হতে পারে। রেকর্ডের প্রকৃত সংখ্যা একই, কিন্তু অনুমান ভিন্ন। এটি পুরানো বা অনুপস্থিত পরিসংখ্যানের কারণে হতে পারে। মনে রাখবেন যে টেবিল ভেরিয়েবলের কোন পরিসংখ্যান নেই, তাই প্ল্যান সবসময় 1 এবং 1K রিটার্ন করে নতুন রিলিজে যতক্ষণ না পুনরায় কম্পাইল করার বিকল্পটি ব্যবহার করা হয়। সুতরাং, সারণী ভেরিয়েবলগুলি বিপুল সংখ্যক রেকর্ডের জন্য একটি ভাল পছন্দ নয়৷
অপারেটর সাজান
আপনাকে সাজানোর প্রভাব বিবেচনা করতে হবে। সর্ট অপারেটরটি বেশিরভাগ নিম্নলিখিত ফাংশনগুলির জন্য ব্যবহৃত হয়:সমষ্টি, যোগদান একত্রিত করুন বা ধারা অনুসারে অর্ডার করুন। এটি শুধুমাত্র কয়েকটি রেকর্ডের সাথে প্রভাব ফেলতে পারে না, তবে প্রতিটি অতিরিক্ত রেকর্ডের সাথে প্রক্রিয়াকরণ ধীর হয়ে যায়। বাছাই এড়াতে চেষ্টা করুন বা ধারা অনুসারে অর্ডারটি ব্যবহার করবেন না। যদি সাজানোর প্রয়োজন হয়, একটি অ্যাপ্লিকেশনে সাজানো ডেটা পাঠানোর পরিবর্তে সাজানোর জন্য অ্যাপ্লিকেশন গ্রিড ব্যবহার করুন৷
নিম্নলিখিত চিত্রটি সাজানোর খরচ দেখায়:
স্পুল অপারেটর
আরেকটি কী অপারেটর যা আপনাকে দেখতে হবে তা হল স্পুল। স্পুল একটি ধীর অপারেটর কারণ এটি লুকানো বা অস্থায়ী বস্তু বা কাজের টেবিল intempdb সংরক্ষণ করে। এটি নির্দিষ্ট অপারেটরগুলির সাথেও ধীর হয়ে যায় যা এটিকে রিবন্ডর রিওয়াইন্ড করে। এসকিউএল সার্ভারে অনেক ধরনের স্পুল রয়েছে, যেমন আগ্রহী, অলস, টেবিল/সূচক ইত্যাদি। SQL সার্ভার স্পুল ব্যবহার করে যখন ইন্টারমিডিয়েটারসাল্ট সেটের জন্য সোর্স টেবিলে ফিরে যাওয়ার পরিবর্তে atemp ওয়ার্ক টেবিলে উল্লেখ করা ভাল। নিম্নলিখিত চিত্রটি একটি উদাহরণ দেখায়:
স্পুল দিয়ে, রিবাইন্ড এবং রিওয়াইন্ডের সংখ্যা লক্ষ্য করা গুরুত্বপূর্ণ। রিবাইন্ডের চেয়ে রিউইন্ডিস ব্যয়বহুল। উদাহরণস্বরূপ, নিম্নলিখিত ছবিতে, অপারেটরটি 2674 রিওয়াইন্ড দেখায়, যা বোঝায় যে ডেটা পাওয়ার জন্য কোয়েরিটি 2674 বার পুনরায় কার্যকর করা হয়েছে। এটি প্রতিটি অপারেটরকে টেবিল স্পুল থেকে টেবিল স্ক্যানে ফিরিয়ে দেয় প্রতিটি রেকর্ডিন রিওয়াইন্ড পেতে। রিবাইন্ড মানে এটি স্পুল থেকে ডেটা পেয়েছে এবং টেবিল স্ক্যানের জন্য ফিরে আসেনি৷
৷হ্যাশ এবং নেস্টেড লুপ অপারেটর
কারণ তারা ছোট রেকর্ড সেটগুলিতে ভাল পারফর্ম করে, হ্যাশ এবং নেস্টেড লুপগুলি পরবর্তী অপারেটর যা আপনার বিবেচনা করা উচিত। যাইহোক, বড় রেকর্ড সেটের জন্য, বা যখন আনুমানিক এবং বাস্তব পরিকল্পনার মধ্যে একটি বড় পার্থক্য থাকে, এই অপারেটরগুলি একটি বিশাল প্রভাব তৈরি করতে পারে কারণ তারা মেমরির পরিবর্তে tempdb ব্যবহার করতে পারে। এসকিউএল সার্ভার অপারেটরের বিশদ বিবরণে নিম্নলিখিত সতর্কতা পোস্ট করে:"অপারেটর ব্যবহার করে টেম্পডিবি নির্বাহের সময় ডেটা ছড়িয়ে দিতে"। যদি এটি ঘটে তবে পরিসংখ্যানের দিকে মনোযোগ দিন। একটি ভুল অনুমান সহ, লুপটি মেমরি বরাদ্দে কম পড়ে বা এটি পুনরাবৃত্তি করতে থাকে। মৃত্যুদন্ড কার্যকর করার জন্য বরাদ্দ মেমরি তাকান. মেমরি বরাদ্দ দেখতে, এক্সিকিউশন প্ল্যানের স্টার্ট পয়েন্ট (বাম-থেকে-ডান) নির্বাচন করে সম্পত্তি বাক্স খুলুন। যদি কিছু অস্বাভাবিক না হয়, তাহলে ক্যোয়ারী টিউনিং আদর্শ পছন্দ হওয়া উচিত।
উপসংহার
একটি ক্যোয়ারী অপ্টিমাইজ করার জন্য আপনার প্রথম লক্ষ্য হওয়া উচিত সামগ্রিক পঠন এবং লেখা কমানো (অর্থাৎ, ডিস্কে I/O)। মেমরিতে পড়া এবং লেখার জন্য লজিক্যাল রিডগুলি ভুলে যাবেন না। I/O হ্রাস করা বেশিরভাগ সমস্যার সমাধান করে এবং প্রশ্নগুলি আরও দ্রুত চলে।
এর পরে, অন্যান্য অপারেশনগুলি দেখুন যা ontempdb কার্যকলাপের কারণে ব্যয়বহুল। মনে রাখবেন, tempdb অনেক ক্রিয়াকলাপের জন্য ব্যবহৃত হয় এবং সর্বদা ব্যয়বহুল। রিওয়াইন্ডের জন্য দেখুন - যেকোনো অপারেশন, স্পুল, বাছাই, এবং লুপগুলি সম্পাদনের সংখ্যা।
tempdb এর সাথে ব্যবহার করার সময় এগুলি ব্যয়বহুল। প্রতিটি অপারেটরের সতর্কতা পর্যালোচনা করতে ভুলবেন না কারণ সেগুলি ভাল সূত্র প্রদান করে। যদিও এই পোস্টটি অনুপস্থিত সূচক অপারেটর নিয়ে আলোচনা করে না, তার মানে এই নয় যে আপনি এটিকে উপেক্ষা করতে পারেন।
এটি পর্যালোচনা করুন, কিন্তু অন্ধভাবে সূচক তৈরি করবেন না। একই কলামে উপলব্ধ অন্যান্য সূচী পরীক্ষা করুন, এবং আপনার ডেটাবেসে চলমান প্রশ্নগুলির উপর প্রভাব বিবেচনা করুন৷
কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাব ব্যবহার করুন। আপনি আমাদের সাথে একটি কথোপকথনও শুরু করতে পারেন৷