
آیا استفاده از Index در پایگاه داده، همیشه باعث افزایش سرعت کوئریها میشود؟
جواب کوتاه: خیر.
ایندکس (Index) یکی از ابزارهای مهم در بهینهسازی کوئریهای دیتابیس است، اما استفاده نادرست یا بیشازحد آن میتواند کارایی سیستم را کاهش دهد.
در این مقاله آموزش اوراکل در بخش بهینه سازی کوئری (SQL Tuning) ، ۵ باور رایج اما اشتباه درباره Indexها را بررسی میکنیم تا دید دقیقتری نسبت به نحوه استفاده صحیح از آنها داشته باشید.
اگر می خواهید سرعت اجرای کوئری های خود را چند برابر کنید و کوئری ها را به بهینه ترین حالت ممکن برسانید، پیشنهاد می شود نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
🔹 باور ۱: هر کوئری SELECT با ایندکس سریعتر اجرا میشود
اگر کوئری شما درصد زیادی از دادهها را بازیابی کند، پایگاه داده بهجای ایندکس، کل جدول را میخواند (Full Table Scan) چون سریعتر است.
مثال:
SELECT * FROM EMPLOYEES WHERE GENDER = 'M';
- با توجه به کوئری بالا اگر ۸۰٪ جدول مرد باشد، Oracle ترجیح میدهد کل جدول را اسکن کند تا اینکه از ایندکس استفاده کند.
🔹 باور ۲: هرچه ایندکس بیشتر، عملکرد بهتر
داشتن چندین ایندکس روی یک جدول میتواند عملیات نوشتن مثل INSERT و UPDATE را کند کند و فضای دیسک زیادی هم اشغال کند.
مثال:
UPDATE ORDERS SET STATUS = 'SHIPPED' WHERE ORDER_ID = 123;
- با توجه به کوئری بالا اگر
STATUS
در چند ایندکس وجود داشته باشد، بهروزرسانی این ستون باعث آپدیت شدن همه آن ایندکسها میشود.
🔹باور ۳: ایندکس روی هر شرطی کار میکند
اگر در شرط WHERE از توابع استفاده کنید (مثل UPPER یا TO_CHAR)، ایندکس نادیده گرفته میشود.
برای بهرهگیری از ایندکس در این موارد، باید Function-Based Index بسازید.
مثال:
SELECT * FROM CUSTOMERS WHERE UPPER(CITY) = 'TEHRAN';
🔹باور ۴: Optimizer همیشه از ایندکس استفاده میکند
اگر آمار جدول (Statistics) بهروز نباشد یا جدول خیلی کوچک باشد، Oracle ممکن است ایندکس را نادیده بگیرد.
مثال:
SELECT * FROM PRODUCTS WHERE PRODUCT_ID = 101;
- با توجه به کوئری بالا روی جدول با فقط ۱۰ رکورد، استفاده از Full Table Scan منطقیتر است.
🔹 باور ۵: ایندکس فقط برای SELECT کاربرد دارد
ایندکسها در JOIN، ORDER BY و حتی UPDATE نقش دارند.
همچنین برخی ایندکسها (مثل Bitmap Index) فقط برای سیستمهای تحلیلی مناسباند نه تراکنشی.
🧠 پیشنهادهای عملی قبل از ساخت ایندکس
سؤال | اگر جواب مثبت بود... |
---|---|
آیا ستون در WHERE استفاده میشود؟ | ایندکس بساز |
آیا مقدارهای تکراری زیاد دارد؟ | شاید ایندکس مفید نباشد |
آیا جدول زیاد بهروزرسانی میشود؟ | ایندکس کمتر بساز |
آیا JOIN روی ستون انجام میشود؟ | ایندکس الزامی است |
آیا تابع روی ستون استفاده شده؟ | Function-Based Index بساز |
سوالات متداول درباره ایندکس در Oracle
وقتی شرط WHERE از توابع یا عملیات ریاضی روی ستونها استفاده کند، یا درصد زیادی از دادهها را انتخاب کند.
با دستور EXPLAIN PLAN
و مشاهده Plan اجرا شده:
EXPLAIN PLAN FOR SELECT …;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
با فعالسازی Index Monitoring یا بررسی V$OBJECT_USAGE
میتوان ایندکسهای بلااستفاده را شناسایی کرد.
بسته به نوع استفاده، ۲ تا ۴ ایندکس هدفمند کافی است.
ایندکس زیاد = افت سرعت DML + مصرف فضا
🏁 نتیجهگیری
ایندکس اگر بهدرستی طراحی و استفاده شود، یکی از مؤثرترین ابزارهای بهینهسازی عملکرد کوئریهاست.
اما اگر بدون تحلیل ساخته شود، میتواند باعث افت سرعت، مصرف زیاد منابع، و حتی بروز قفلهای همزمانی شود.
قبل از ساخت هر ایندکس، هدف کوئریها، حجم دادهها و نوع استفاده از جدول را بررسی کن.
📢 مقاله را مفید دیدید؟ برای همکارانتان بفرستید. یا اگر سوالی درباره ایندکس یا بهینهسازی کوئری ها در Oracle دارید، همینجا بپرسید!🚀
دیدگاهتان را بنویسید