
آموزش جامع، روان و کاربردی مکانیزم Read، Buffer Cache و I/O در Oracle
اگر مدتی با Oracle کار کرده باشی، حتماً با این سؤال روبهرو شدهای:
«چرا یک Query بعضی وقتها در کسری از ثانیه اجرا میشود، اما همان Query گاهی چند ثانیه یا حتی چند دقیقه طول میکشد؟»
پاسخ این سؤال، بیشتر از آنکه به خود SQL مربوط باشد، به این موضوع برمیگردد که:
**Oracle داده را از کجا میخواند؟ از حافظه یا از دیسک؟**
در این مقاله آموزش Oracle در بخش آموزش معماری اوراکل، قرار است خیلی ساده، قدمبهقدم و دقیق بررسی کنیم که:
- Oracle دادهها را چگونه میخواند
- Buffer Cache چیست و چه نقشی در Performance دارد
- Logical Read و Physical Read دقیقاً چه تفاوتی دارند
- چرا SQL خوب یعنی استفادهی درست از Cache
اگر بخواهیم اوراکل را از نگاه معماری بررسی کنیم، سه فایل نقش قلب سیستم را بازی میکنند: Datafile، Redolog و Control File.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
اصل طلایی Oracle در خواندن داده
Oracle یک قانون نانوشته اما بسیار مهم دارد:
🔑 تا جایی که ممکن است، از حافظه بخوان؛ نه از دیسک
دلیلش هم واضح است:
- دیسک کند است
- حافظه سریع است
- Performance یعنی کمتر سراغ دیسک رفتن
مسیر کلی خواندن داده در Oracle
وقتی یک Query اجرا میشود، Oracle به این شکل عمل میکند:
SQL Query
↓
Library Cache (Parse و Execution Plan)
↓
Buffer Cache (SGA)
↓
Datafile (dar soorat Cache Miss)
نکته مهم:
Oracle هیچوقت مستقیماً Query را از دیسک پاسخ نمیدهد
حتی اگر داده روی دیسک باشد، اول وارد Cache میشود.
مرحله اول: Parse و Library Cache
قبل از اینکه حتی یک بلاک داده خوانده شود:
- Oracle بررسی میکند آیا SQL قبلاً Parse شده یا نه
- اگر Execution Plan موجود باشد → Soft Parse
- اگر نباشد → Hard Parse (هزینهبر)
در این مرحله:
- هنوز هیچ Data Blockی خوانده نشده
- فقط روی CPU و حافظه کار میشود
Buffer Cache چیست؟
Buffer Cache بخشی از SGA است که Oracle در آن:
- Data Blockها را نگه میدارد
- همان بلاکهایی که دقیقاً در Datafile وجود دارند (مثلاً ۸KB)
📌 Oracle با Row کار نمیکند، با Block کار میکند.
Oracle چطور داده را در Buffer Cache پیدا میکند؟
فرض کن این Query اجرا شود:
SELECT *
FROM employees
WHERE employee_id = 100;
Oracle:
- Execution Plan را بررسی میکند (Index یا Full Table Scan)
- مشخص میکند به کدام Data Block نیاز دارد
- چک میکند:
- آیا این Block در Buffer Cache هست یا نه؟
Cache Hit و Cache Miss (نقطه حساس Performance)
✅ Cache Hit (Logical Read)
اگر Data Block در Buffer Cache باشد:
- داده مستقیماً از RAM خوانده میشود
- بسیار سریع
- به آن میگوییم Logical I/O
آمار مرتبط:
consistent getsdb block gets
❌ Cache Miss (Physical Read)
اگر بلاک در Cache نباشد:
- Oracle بلاک را از Datafile میخواند
- بلاک وارد Buffer Cache میشود
- Query از روی حافظه اجرا میشود
آمار مرتبط:
physical reads
📌 Physical Read یعنی:
- I/O بیشتر
- کندی سیستم
- فشار روی Storage
چه پردازهای داده را میخواند؟
یک اشتباه رایج:
«DBWR دادهها را برای SELECT میخواند»
❌ غلط
| وضعیت | محل خواندن داده | نوع I/O | تأثیر بر Performance |
|---|---|---|---|
| Cache Hit | Buffer Cache (RAM) | Logical Read | بسیار سریع ✅ |
| Cache Miss | Datafile (Disk) | Physical Read | کند و پرهزینه ❌ |
انواع Read در Oracle
۱️⃣ Single Block Read
- خواندن یک بلاک در هر بار
- معمولاً برای Index Scan
Wait Event:
db file sequential read
۲️⃣ Multiblock Read
- خواندن چند بلاک با هم
- معمولاً برای Full Table Scan
Wait Event:
db file scattered read
-
تعداد بلاکها بستگی دارد به:
DB_FILE_MULTIBLOCK_READ_COUNT- Optimizer
وضعیت بلاکها در Buffer Cache
هر Data Block یکی از این حالتها را دارد:
| وضعیت بلاک | توضیح | نقش در Cache |
|---|---|---|
| Free | بلاک خالی و آماده استفاده | قابل جایگزینی |
| Clean | خوانده شده اما تغییری نکرده | قابل حذف در صورت نیاز |
| Dirty | تغییر کرده و روی دیسک نوشته نشده | باید توسط DBWR نوشته شود |
Dirty Blockها بعداً توسط DBWR نوشته میشوند.
وقتی Buffer Cache پر شود چه میشود؟
Oracle مجبور است:
- بلاکهای کماستفاده را حذف کند
- بلاکهای پرتکرار را نگه دارد
📌 Query بد میتواند:
- Cache را پر کند
- بلاکهای مهم را بیرون بیندازد
- Performance کل سیستم را تحتتأثیر قرار دهد
Consistent Read (خواندن سازگار)
Oracle حتی هنگام Update:
- داده را سازگار نشان میدهد
- از Undo برای ساخت نسخه قدیمی استفاده میکند
این عملیات هم:
- در Buffer Cache انجام میشود
- بدون قفلکردن Read
📌 یکی از بزرگترین مزیتهای Oracle همینجاست.
ارتباط Execution Plan با Cache
| Access Path | نوع Read | میزان I/O | کارایی |
|---|---|---|---|
| Index Unique Scan | Single Block | کم | بسیار عالی ✅ |
| Index Range Scan | Single Block | متوسط | خوب ✅ |
| Full Table Scan | Multiblock | زیاد | ضعیف ❌ |
انتخاب Access Path اشتباه = Physical Read زیاد = Performance ضعیف
مثال ساده و کاربردی
SELECT COUNT(*)
FROM orders;
- Full Table Scan
- Multiblock Read
- Physical Read بالا
اما:
SELECT COUNT(*)
FROM orders
WHERE order_id = 100;
-
با Index مناسب:
- Single Block Read
- Logical Read بالا
- اجرای سریع
سوالات متداول درباره مکانیزم Read، Buffer Cache و I/O در اوراکل
Oracle Buffer Cache بخشی از حافظه SGA است که Oracle دادهها را قبل از دسترسی مجدد در آن نگه میدارد.
وقتی یک Query اجرا میشود، Oracle ابتدا بررسی میکند که Data Block موردنیاز در Buffer Cache وجود دارد یا نه. اگر بلاک در Cache باشد، داده از RAM خوانده میشود که بسیار سریعتر از دیسک است.
بهطور خلاصه:
- Buffer Cache باعث کاهش Physical Read میشود
- استفادهی درست از Cache = Performance بهتر
- SQL بد میتواند Cache را بیاثر کند
به همین دلیل، Buffer Cache یکی از مهمترین اجزای مؤثر در عملکرد Oracle Database محسوب میشود.
Logical Read زمانی اتفاق میافتد که Oracle داده را از Buffer Cache (حافظه) بخواند، در حالی که Physical Read زمانی رخ میدهد که داده در Cache وجود نداشته باشد و Oracle مجبور شود آن را از دیسک (Datafile) بخواند.
تفاوت اصلی:
- Logical Read سریع و کمهزینه است
- Physical Read کند و پرهزینه است
- Performance خوب یعنی Logical Read بالا و Physical Read پایین
در SQL Tuning، هدف اصلی معمولاً این است که Queryها را طوری بنویسیم که بیشترین استفاده را از Logical Read داشته باشند.
Oracle همیشه ابتدا Buffer Cache را بررسی میکند.
اگر Data Block موردنیاز در Cache موجود باشد، داده مستقیماً از حافظه خوانده میشود.
اما اگر بلاک در Cache نباشد (Cache Miss)، Oracle آن را از Datafile روی دیسک میخواند و سپس وارد Buffer Cache میکند.
این تصمیمگیری به عواملی مثل موارد زیر بستگی دارد:
- Execution Plan
- نوع Access Path (Index Scan یا Full Table Scan)
- اندازه Buffer Cache
- الگوی استفاده از دادهها
به همین دلیل است که طراحی درست Index و نوشتن SQL بهینه، نقش مستقیمی در استفاده از Cache دارند.
Full Table Scan باعث میشود Oracle تعداد زیادی Data Block را بهصورت Multiblock Read از دیسک بخواند، مخصوصاً اگر جدول بزرگ باشد و دادهها در Cache موجود نباشند.
نتیجه:
- Physical Read زیاد
- فشار روی I/O
- افزایش زمان پاسخ Query
در بسیاری از موارد، استفاده از Index مناسب میتواند Full Table Scan را به Index Scan تبدیل کند و باعث شود دادهها بهصورت Single Block Read و اغلب از Cache خوانده شوند که بهمراتب سریعتر است.
جمعبندی
✅ Oracle همیشه اول Cache را بررسی میکند
✅ Logical Read سریع و ارزان است
✅ Physical Read کند و پرهزینه است
✅ SQL خوب یعنی استفاده درست از Buffer Cache
✅ Performance Oracle یعنی مدیریت I/O
📥 اگر سوالی داری در مورد درباره مکانیزم Read، Buffer Cache و I/O در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید