
مقدمه : Database Buffer Cache در اوراکل چه اهمیتی دارد؟
اگر با دیتابیس Oracle کار میکنی یا تازه وارد دنیای ادمینی یا توسعه دیتابیس شدی، حتماً اصطلاح Database Buffer Cache به گوشت خورده.
ولی واقعاً این Cache چی هست؟ به چه دردی میخوره؟ چطور کار میکنه؟ و چطور باعث میشه سرعت دیتابیس ما چند برابر بشه؟ 🚀
در این مقالهی ساده و کاربردی آموزش اوراکل، به صورت کامل با مفهوم Buffer Cache در Oracle آشنا میشی، نحوه عملکردش رو یاد میگیری و با مثال واقعی میفهمی چطوری باعث افزایش سرعت دیتابیس میشه.
اگر می خواهید در مورد Tablespace، Redo Logs و Datafiles در اوراکل بیشتر آشنا بشید نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
Database Buffer Cache چیست؟
Database Buffer Cache یک فضای حافظهای داخل رم (RAM) سرور اوراکل هست که بلاکهای دادهای خواندهشده از دیسک رو موقتاً نگهداری میکنه.
یعنی وقتی یه کوئری اجرا میشه، Oracle بهجای اینکه مستقیماً از روی دیسک دیتا بخونه (که زمانبره)، اول میره تو Buffer Cache ببینه اون دادهها قبلاً خونده شدن یا نه.
🔸 اگر بودن → مستقیم از رم میخونه (خیلی سریع)
🔸 اگر نبودن → از دیسک میخونه و اون بلاکها رو تو حافظه Cache میکنه
Database Buffer Cache چطور کار میکنه؟
- کاربر یه کوئری اجرا میکنه (مثلاً SELECT یا UPDATE)
- Oracle بررسی میکنه بلاکهای مربوطه توی حافظه هست یا نه؟
- اگر هست → از Buffer Cache میخونه
اگر نیست → از دیسک میخونه و میذاره توی Cache - اگر کوئری، داده رو تغییر بده → اون بلاک به “Dirty Buffer” تبدیل میشه
- در زمان مناسب، Oracle اون بلاک رو میفرسته روی دیسک (با DBWR)
مثال کاربردی از Database Buffer Cache برای درک بهتر
▶️ مثال SELECT
SELECT first_name FROM employees WHERE department_id = 10;
اگر این بلاک قبلاً خونده شده باشه، دادهها از Cache خونده میشن → خیلی سریع!
اگر نه، اول از دیسک میاد، بعدش توی Cache ذخیره میشه برای استفاده بعدی.
🧽 مثال UPDATE (Dirty Buffer)
UPDATE employees SET salary = salary + 500 WHERE employee_id = 101;
Oracle فقط بلاک مربوط به اون رکورد رو توی حافظه تغییر میده
ولی هنوز اونو روی دیسک نمینویسه → اون بلاک الان یه Dirty Buffer حساب میشه
بعداً، پروسهی DBWR میاد و اونو توی دیسک ذخیره میکنه.
چرا Database Buffer Cache اینقدر مهمه؟
مزیت | توضیح |
---|---|
✅ افزایش سرعت اجرای کوئریها | چون دسترسی به رم خیلی سریعتر از دیسک است |
✅ کاهش فشار روی دیسک | کاهش عملیات I/O فیزیکی روی هارد |
✅ عملکرد بهتر سیستم | مناسب برای اپلیکیشنهای real-time و سنگین |
دیاگرام مفهومی عملکرد Database Buffer Cache
+------------------+
| User Executes |
| SQL Statement |
+------------------+
|
v
+-------------------------+
| Check Buffer Cache (RAM)|
+-------------------------+
| |
| Hit ✅ | Miss ❌
v v
+------------+ +---------------+
| Read from | | Read from |
| Cache | | Datafile |
+------------+ +---------------+
|
v
+----------------+
| Put in Cache |
+----------------+
|
v
+-----------------+
| Return to User |
+-----------------+
ابزارهای بررسی وضعیت Database Buffer Cache
برای دیدن اندازه یا بررسی وضعیت Buffer Cache، از این کوئریها استفاده کن:
بررسی سایز Cache:
SELECT component, current_size
FROM v$sga_dynamic_components
WHERE component = 'DEFAULT buffer cache';
بررسی Cache Hit Ratio:
SELECT
name, value
FROM v$sysstat
WHERE name IN ('db block gets', 'consistent gets', 'physical reads');
و فرمول محاسبه:
Hit Ratio = 1 - (physical reads / (consistent gets + db block gets))
چطور Database Buffer Cache رو بهینه کنیم؟
۱.اندازه مناسب براش تعریف کن:
ALTER SYSTEM SET db_cache_size = 512M SCOPE=BOTH;
۲. استفاده از AWR Reports و ASH برای مانیتورینگ
۳.نوشتن کوئریهای بهینه برای کاهش I/O فیزیکی
اجزای مهم در Database Buffer Cache
جزء | شرح |
---|---|
Buffer | بلاک دادهای (مثلاً ۸KB) که در حافظه برای استفاده سریع ذخیره میشود. |
Clean Buffer | بلاکی که فقط خوانده شده و تغییری روی آن انجام نشده یا تغییراتش به دیسک منتقل شده است. |
Dirty Buffer | بلاکی که در حافظه تغییر کرده ولی هنوز به دیسک نوشته نشده است. |
DBWR (Database Writer) | فرآیند بکگراند که Dirty Bufferها را در زمان مناسب به دیسک منتقل میکند. |
LRU List (Least Recently Used) | ساختاری برای اولویتبندی بلاکها بر اساس میزان استفاده؛ بلاکهای کماستفاده زودتر حذف میشوند. |
سوالات متداول درباره Database Buffer Cache
Database Buffer Cache بلاکهای دادهای خواندهشده از دیسک را در حافظه RAM نگه میدارد تا اگر دوباره به آنها نیاز بود، از حافظه و با سرعت بالا خوانده شوند.
این کار باعث افزایش سرعت اجرای کوئریها و کاهش فشار روی دیسک میشود.
Clean Buffer بلاکی است که فقط خوانده شده و هیچ تغییری روی آن انجام نشده یا تغییراتش به دیسک منتقل شده است.
Dirty Buffer بلاکی است که در حافظه تغییر کرده ولی هنوز به دیسک نوشته نشده است.
Oracle این بلاکها را در زمان مناسب با فرآیند DBWR به دیسک میفرستد.
برای بررسی وضعیت Database Buffer Cache میتوان از ویوهای سیستمی مانند v$sga_dynamic_components
برای اندازه و از v$sysstat
برای محاسبه Cache Hit Ratio استفاده کرد.
همچنین میتوان با ابزارهایی مثل AWR Report وضعیت عملکرد Cache را تحلیل کرد.
برای بهینهسازی Buffer Cache باید:
- اندازهی مناسبی برای
db_cache_size
تعریف کرد - از کوئریهای بهینه استفاده کرد تا دسترسی به دیسک کمتر شود
- با ابزارهایی مانند AWR و ASH الگوهای دسترسی به حافظه را مانیتور و تحلیل کرد
نتیجهگیری
اگر میخوای دیتابیس اوراکل رو سریع، بهینه و حرفهای مدیریت کنی، باید Database Buffer Cache رو مثل کف دستت بشناسی.
دانستن اینکه چه زمانی داده از رم خونده میشه یا از دیسک، بهت کمک میکنه تا Bottleneckهای سرعتی رو حل کنی و عملکرد دیتابیس رو به سطح حرفهای برسونی.
📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در مورد Database Buffer Cache دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید