ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

Oracle چگونه داده‌ها را می‌خواند و در حافظه Cache می‌کند؟

آموزش جامع، روان و کاربردی مکانیزم 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:

  1. Execution Plan را بررسی می‌کند (Index یا Full Table Scan)
  2. مشخص می‌کند به کدام Data Block نیاز دارد
  3. چک می‌کند:
    • آیا این Block در Buffer Cache هست یا نه؟

Cache Hit و Cache Miss (نقطه حساس Performance)

✅ Cache Hit (Logical Read)

اگر Data Block در Buffer Cache باشد:

  • داده مستقیماً از RAM خوانده می‌شود
  • بسیار سریع
  • به آن می‌گوییم Logical I/O

آمار مرتبط:

  • consistent gets
  • db block gets

❌ Cache Miss (Physical Read)

اگر بلاک در Cache نباشد:

  1. Oracle بلاک را از Datafile می‌خواند
  2. بلاک وارد Buffer Cache می‌شود
  3. 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 در اوراکل داری، در بخش کامنت‌ها بپرس.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *