ডাটাবেস মেমরি টিউনিং
মেমরি টিউনিং মুক্ত মেমরি Oracle মেমরি কম্পোনেন্টগুলোর মধ্যে বিতরণ বা রি-আলোকেট করে। এটি মূলত Oracle কোয়ারি-তে পারফরম্যান্স টিউনিং-এ ব্যবহৃত হয়।
আজকাল প্রতিটি ক্লায়েন্টের জন্য একটি বড় সমস্যা হল ডাটাবেস পারফরম্যান্স। এই ব্লগে ব্যাখ্যা করা হয়েছে ডাটাবেসে মেমরি কীভাবে টিউন করতে হয় যা ডাটাবেসে হাই পারফরম্যান্স ফলাফল দেয়। নিচে মেমরি টিউনিং পদ্ধতির বিভিন্ন ধরন দেওয়া হল: OS লেভেল প্রসেস টিউনিং, CPU টিউনিং, RAM টিউনিং, ডাটাবেস টিউনিং ইত্যাদি। এই ব্লগে আমি ডাটাবেসে মেমরি টিউনিং নিয়ে আলোচনা করব।
ডাটাবেস মেমরি টিউনিং:
ডাটাবেসের জন্য মেমরি টিউনিং কিছু না/System Global Area (SGA) টিউনিং। SGA টিউনিং-এর সাথে সম্পর্কিত প্রধান কম্পোনেন্টের তালিকা নিচে দেওয়া হল। আসুন প্রতিটি কম্পোনেন্ট বিস্তারিত দেখি:
- Keep Pool
- Default Pool, Recycle Pool, Stream Pool
- DB Buffer Cache: Free buffers, modified buffers, pinned buffers
- Shared pool
Keep Pool:
কিছু প্যাকেজ আছে যা দৈনন্দিন ব্যবহার হয়। পারফরম্যান্স বাড়াতে, সেগুলো SGA-তে রাখতে হয়। প্রসিডিউরটির সাহায্যে আপনি সেই প্যাকেজকে Keep Pool-এ রাখতে পারেন। যদি SGA-তে অ্যালোকেট করা স্পেস শাটডাউন হয়, তবে SGA-কে র্যাম-এ রি-আলোকেট করতে হয়, সে সময় প্যাকেজ Keep Pool-এ রাখলেও ফ্লাশ অফ হয়ে যাবে। পরবর্তী বার রিস্টার্ট করলে এবং সেই প্যাকেজ এক্সিকিউট করলে, প্যাকেজ ডাটাবেস শাটডাউন होने পর্যন্ত Keep Pool-এ থাকবে। এটি করার মাধ্যমে আমরা I/O কমানো।
হিট রেশিওর সাহায্যে আপনি নিশ্চিত করতে পারেন যে লাইব্রেরি ক্যাশ থেকে পার্স কোড এক্সিকিউশন প্ল্যান ফ্লাশ হচ্ছে কিনা। লাইব্রেরি ক্যাশের হিট রেশিও ৮৫% এর চেয়ে বেশি হওয়া উচিত।
Stream Pool ডেটা পাম্পের জন্য বাফার তৈরি করতে ব্যবহৃত হয়। দৈনন্দিন কিছু টেবিল (ছোট টেবিল) পারফরম্যান্স বাড়াতে ব্যবহৃত হয়। সেগুলো SGA-তে (Keep pool) রাখা ভালো। এটি পারফরম্যান্স বাড়ায় যেখানে আপনি ডিস্ক থেকে ডেটা ফেচ না করে মেমরি থেকে ফেচ করছেন। বড় টেবিলের জন্য আমাদের recycle pool আছে।
ডিফল্টভাবে, যখনই আমরা সেই টেবিলগুলো (ছোট টেবিল) সিলেক্ট করি ব্লকের আকারে ডেটা বাফার ক্যাশে ফেচ হয় এবং সেটি default pool-এ থাকে। আপনি অন্য টেবিল সিলেক্ট করলে এই ডিফল্ট পুল ফ্লাশ অফ হয়ে যায়। আপনার বাফারে স্পেস থাকলে ঠিক আছে, না থাকলে পুরনো টেবিল ফ্লাশ করে নতুন টেবিলের জায়গা করা হয়। পারফরম্যান্স বাড়াতে, ছোট টেবিলগুলো Keep pool-এ রাখুন default pool-এ না। ডেটা বাফার ক্যাশের হিট রেশিও ৯৫% এর চেয়ে বেশি হওয়া উচিত। ৯৫% এর কম হলে ডাটাবেস বাফার ক্যাশ রিসাইজ করতে হবে।
মেমরি টিউনিং-এর প্রধান অংশ হল Database buffer cache এবং shared pool, যা মেমরিতে পর্যাপ্ত ডেটা মেইন্টেইন করার জন্য উপকারী। সবার জানা উচিত Database buffer cache-এ সীমিত অপারেশন SGA টিউনিং-এর জন্য। ব্লগের শেষে আমি কিছু স্যাম্পল SQL কোয়ারি উদাহরণ শেয়ার করব হিট রেশিও ক্যালকুলেট করে মেমরি টিউন করার জন্য।
Free Buffers
মডিফাইড ডেটা ফেচ করা ব্লক ব্যবহার করে এবং ডেটা বাফার ক্যাশে কপি করে ইমেজ (ডেটা) পরিবর্তন করার আগে। এই বাফারগুলোকে Free Buffers বলা হয়। নিচের ছবিতে, ডিস্কে মান ১০০০ বা মেমরিতে মান ১০০০ একই। নিচের ছবিটি Free buffer দেখাচ্ছে:
Modified Buffers
Modified buffers কে Dirty Buffers ও বলা হয়। ডিস্কে ইমেজ এবং ডেটা বাফার ক্যাশে ডেটার ইমেজ পরিবর্তন হয়েছে, কিন্তু এই বাফার বা ডেটা এখনও ডিস্কে লেখা হয়নি। এই বাফারগুলোকে Dirty Buffers বলা হয়।
নিচের ছবিটি Modified buffer দেখাচ্ছে:
Pinned Buffers
DB buffer cache-এ ডেটা প্রতিবার পরিবর্তন হয়। সার্ভার প্রসেস এই মডিফাইড ডেটা পরবর্তী ট্রানজ্যাকশনের জন্য সিলেক্ট করে। এই সিলেক্টেড ডেটা হল pinned data বা buffer।
Physical reads: Oracle ডেটা ব্লক যা Oracle ডিস্ক থেকে পড়ে I/O করে।
Logical reads: Oracle ডেটাবেস বাফার ক্যাশ থেকে ডেটা পড়ে অনুরোধ সन्तুষ্ট করতে পারলে তা logical reads-এ পড়ে।
DB block Gets: Oracle ডেটাবেস বাফার ক্যাশে প্রয়োজনীয় ডেটা পেলে, Oracle চেক করে ডেটা কমিটেড কিনা, কমিটেড হলে বাফার থেকে ফেচ করে। এই বাফারগুলোকেও DB buffer gets বলা হয়।
Consistent Reads: ডেটাবেস বাফার ক্যাশে উপস্থিত ব্লকগুলো, মডিফাইড কিন্তু কমিটেড নয়। তাই ডেটা আনডো ডেটাফাইল থেকে ফেচ করতে হয়।
db_buffer_cache-এর লক্ষ্য logical reads বাড়ানো।
Soft Parsing: যদি লাইব্রেরি ক্যাশে এক্সিকিউশন প্ল্যান ইতিমধ্যে উপলব্ধ থাকে, তবে এটি ডিস্কে যাবে না, এটি বিদ্যমান এক্সিকিউশন প্ল্যান থেকে পার্স প্ল্যান (পার্স কোড) তৈরি করবে। এটাকে Soft Parse বলা হয়।
Hard Parsing: একটি পার্স কোড তৈরি করতে, এটি চেক করবে কোনো এক্সিকিউশন প্ল্যান উপলব্ধ কিনা, উপলব্ধ থাকলে সফট পার্সের সাথে যাবে। এক্সিকিউশন প্ল্যান উপলব্ধ না থাকলে, এটি হার্ড পার্স করবে অর্থাৎ ডিস্কে যাবে।
Shared Pool: Shared Pool হল Library Cache এবং Data Dictionary Cache-এর কম্বিনেশন।
Library Cache: Library Cache-এর লক্ষ্য soft parsing বাড়ানো।
লক্ষ্য অর্জনের পদ্ধতিসমূহ:
- Bind variables ব্যবহার করুন
- স্টোরড প্রসিডিউর লিখুন
- Hit ratio (৮৫% এর চেয়ে বেশি হওয়া উচিত, না হলে shared pool সাইজ বাড়ান)
- DBMS_Shared_pool (প্যাকেজ) Hit ratio SQL কোয়ারি ব্যবহার করে মেমরি টিউনিং-এ বড় ভূমিকা পালন করে।
Data Dictionary Cache: এটাকে Row cache ও বলা হয়। Data Dictionary Cache hit ratio ৮৫% এর চেয়ে বেশি হওয়া উচিত, না হলে shared pool সাইজ বাড়ান।
হিট রেশিও ক্যালকুলেট করার নমুনা কোয়ারিগুলো:
select (sum(pinhits)/sum(pins))*100 as lchitratio from v$librarycache;
select namespace, pins, pinhits, reloads from v$librarycache order by namespace;
dbms_Shared_pool প্যাকেজ পেতে @$ORACLE_HOME/rdbms/admin/dbmspool.sql চালান
select namespace, kept, locks, executions from v$db_object_cache where type like '%PROC%';
Data Dictionary Cache hit ratio:
select (sum(gets-getmisses-fixed))/sun(gets) as "ddchitratio" from v$rowcache;
Redo log Buffer Cache:
select name, value from v$sysstat where name like 'redo%';
আশা করি উপরের আলোচিত পয়েন্টগুলো আপনার জন্য উপকারী হবে এবং আপনি এখন সহজে ডাটাবেসে মেমরি টিউন করতে পারবেন।
ফিডব্যাক ট্যাব ব্যবহার করে মন্তব্য করুন বা প্রশ্ন জিজ্ঞাসা করুন। আপনি আমাদের সাথে কথা বলতে পারেন।