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

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

Full Table Scan بهتره یا Index Scan؟ کِی باید کدوم رو انتخاب کنیم؟

اگر دارید با دیتابیس اوراکل (Oracle Database) کار می‌کنید، احتمالاً این سوال براتون پیش اومده: کوئری من بهتره از Full Table Scan استفاده کنه یا Index Scan؟
این انتخاب خیلی مهمه، چون روی سرعت اجرای کوئری، مصرف منابع سرور و حتی تجربه کاربری تأثیر مستقیم داره.

توی این مقاله آمورش Oracle از بخش آموزش اوراکل SQL، قراره به زبون ساده ولی دقیق، تفاوت این دو روش رو توضیح بدیم و بگیم در چه شرایطی باید کدومش رو انتخاب کنیم.

اگر می خواهید در دیتابیس اوراکل هنگام آپدیت میلیون‌ها رکورد در Oracle از تغییر داده‌ها جلوگیری کنیم ، پیشنهاد می شود نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

Full Table Scan در Oracle یعنی چی؟

وقتی Oracle از Full Table Scan (FTS) استفاده می‌کنه، یعنی دونه‌به‌دونه ردیف‌های جدول رو بررسی می‌کنه تا جواب کوئری رو پیدا کنه.
این روش مثل اینه که بخوای برای پیدا کردن یه اسم خاص، کل دفترچه تلفن رو ورق بزنی، حتی اگه اون اسم تو صفحه آخر باشه!

🔹 معمولاً Full Table Scan زمانی استفاده می‌شه که:

  • ایندکسی برای شرط کوئری وجود نداره.
  • بیشتر ردیف‌های جدول باید بررسی بشن.
  • جدول خیلی کوچیکه و سریع میشه کامل خوندش.

Index Scan در Oracle چطوری کار می‌کنه؟

برخلاف Full Scan، توی Index Scan اول از همه Oracle می‌ره سراغ ایندکس. مثل اینه که بخوای تو یه کتاب از فهرست استفاده کنی تا سریع به صفحه موردنظر برسی.

🔸 این روش وقتی کاربرد داره که:

  • شرط WHERE روی ستون‌هایی باشه که ایندکس دارن.
  • فقط بخش کوچیکی از جدول نیاز باشه.
  • دنبال مقدار خاصی مثل id یا national_id بگردیم.

مقایسه Full Table Scan و Index Scan

ویژگی Full Table Scan Index Scan
استفاده از ایندکس
سرعت در جداول بزرگ معمولاً کند معمولاً سریع
مناسب برای تحلیل، خواندن بیشتر جدول، جداول کوچک جست‌وجوی سریع، فیلتر روی مقادیر خاص
مصرف منابع بیشتر کمتر
مثال کاربردی LIKE '%abc%' WHERE id = 123

چه موقع Full Table Scan بهتره؟

✅ وقتی یکی از این شرایط وجود داشته باشه:

  • جدول کوچیکه (مثلاً کمتر از ۱۰۰۰ رکورد).
  • شرط خاصی تو کوئری نیست یا روی ستونی بدون ایندکس نوشته شده.
  • بیشتر داده‌ها باید بررسی بشن (مثلاً بالای ۱۵٪ رکوردها).
  • کوئری‌های آماری و گزارش‌گیری‌های سنگین داریم.
  • ایندکس وجود داره ولی selectivity پایینه (شرط خیلی کلیه).

📌 مثال:

				
					SELECT * FROM employees WHERE last_name LIKE '%Smith%';
				
			

چه موقع Index Scan بهتره؟

✅ در این شرایط ایندکس عملکرد بهتری داره:

  • شرط روی ستون ایندکس‌دار هست.
  • فقط تعداد کمی رکورد نیاز داریم.
  • ستون کلیدی یا یکتا هست (مثلاً شماره ملی، ID، کد رهگیری).
  • کوئری‌های پرتکرار با شرط‌های مشخص اجرا می‌شن.

📌 مثال:

				
					SELECT * FROM customers WHERE national_id = '1234567890';

				
			

از کجا بفهمیم Oracle از کدوم استفاده کرده؟

برای بررسی مسیر اجرای کوئری، از ابزارهای زیر استفاده کن:

  • EXPLAIN PLAN FOR ...
  • DBMS_XPLAN.DISPLAY
  • AUTOTRACE در SQL*Plus
  • مشاهده real execution plan در AWR یا V$SQL_PLAN

نکات کاربردی برای بهینه‌سازی کوئری در Oracle

  • همیشه آمار جدول‌ها و ایندکس‌ها رو با DBMS_STATS.GATHER_TABLE_STATS به‌روز کن.
  • ایندکس رو فقط روی ستون‌هایی بساز که زیاد توی شرط WHERE یا JOIN میان.
  • اگر شرطت مثل LIKE '%abc%' باشه، ایندکس جواب نمی‌ده.
  • ایندکس زیاد باعث کند شدن عملیات INSERT و UPDATE میشه.
  • از Hint مثل /*+ FULL(emp) */ یا /*+ INDEX(emp emp_nid_idx) */ برای تست رفتار کوئری استفاده کن.

سوالات متداول تفاوت Full Table Scan و Index Scan

خیر! گاهی استفاده از Full Table Scan سریع‌تره،

مخصوصاً اگه جدول کوچیک باشه یا بخوایم بیشتر داده‌ها رو بخونیم.

با EXPLAIN PLAN بررسی کن و ببین آیا full scan استفاده میشه یا index scan.

اگه کوئری کند بود و شرط مناسبی داشتی، ایندکس شاید کمک کنه.

جمع‌بندی نهایی

وضعیت پیشنهاد
جدول خیلی کوچیکه Full Table Scan
دنبال مقدار خاص با ایندکس هستی Index Scan
شرط کلی روی ستون بدون ایندکس Full Table Scan
Selectivity بالاست (مثلاً id = ...) Index Scan
کوئری گزارش‌گیری روی جدول بزرگ Full Table Scan یا Parallel

میثم راد

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

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

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