
اگر دارید با دیتابیس اوراکل (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.DISPLAYAUTOTRACEدر 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 |

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