
یکی از مهارتهای حیاتی برای هر DBA یا توسعهدهنده Oracle، توانایی درک و تحلیل Execution Plan است.
این طرح در واقع نقشه راهی است که Optimizer تعیین میکند تا مشخص شود یک Query چگونه و با چه ترتیبی اجرا شود.
در نسخه جدید Oracle Database 23ai، با قابلیتهای تازهای مثل Adaptive Plans، AI-Assisted Tuning و نمایشهای آماری پیشرفته، تحلیل و رفع کندی Queryها بسیار سادهتر و دقیقتر شده است.
در این مقاله آموزش Oracle در بخش آموزش بهینه سازی کوئری (SQL Tuning) یاد میگیریم:
- چطور Execution Plan را تولید کنیم،
- هر بخش از Plan را بخوانیم،
- و با استفاده از آمار واقعی، گلوگاههای کندی (Performance Bottlenecks) را شناسایی کنیم.
وقتی یه Query در Oracle 19c کند میشه، اولین چیزی که ممکنه به ذهنت برسه اینه که “حتماً دیتام زیاده” یا “سیستم ضعیفه!”. اما واقعیت اینه که کندی همیشه از حجم داده یا سختافزار نیست — معمولاً یه گره نامرئی، یعنی Bottleneck واقعی داره که باید قدمبهقدم پیدا بشه.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
۱. دستور EXPLAIN PLAN
تولید Execution Plan در Oracle 23ai
EXPLAIN PLAN FOR
SELECT e.emp_name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE e.salary > ۱۰۰۰۰;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
نتیجه فقط یک Estimated Plan است، یعنی بر اساس آمار فعلی جدول، بدون اجرای واقعی.
۲. استفاده از AUTOTRACE
اگر بخواهیم علاوه بر Plan، آمار واقعی اجرا (Rows، Elapsed Time و غیره) را هم ببینیم:
SET AUTOTRACE ON
SELECT /*+ gather_plan_statistics */ e.emp_name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.dept_id
AND e.salary > ۱۰۰۰۰;
AUTOTRACE خروجیای ترکیبی تولید میکند: هم Execution Plan، هم آمار مصرف شده.
۳. مشاهده Plan واقعی با DBMS_XPLAN.DISPLAY_CURSOR
در Oracle 23ai، Optimizer میتواند Plan واقعی (همراه با آمار اجرا) را حتی در زمان اجرا نشان دهد:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
این روش دقیقترین راه مشاهده Plan است چون Actual Rows را هم نشان میدهد.
ساختار Execution Plan در اوراکل
هر Plan از چند مرحله تشکیل شده که از پایینترین گره اجرا آغاز میشود. ستونهای کلیدی جدول خروجی:
| ستون | توضیح |
|---|---|
| Operation | نوع عملیات (مثل اسکن جدول، نوع Join و ...) |
| Options | جزئیات نحوهی اجرای عملیات مثل Full Scan یا Range Scan |
| Name | نام جدول یا ایندکس |
| Rows | تخمین تعداد رکوردهای خروجی از هر مرحله |
| Cost | هزینه محاسبهشده توسط Optimizer |
نمونه:
| ID | Operation | Name | Rows | Cost |
|---|---|---|---|---|
| ۰ | SELECT STATEMENT | – | – | ۱۲ |
| ۱ | NESTED LOOPS | – | ۱۵ | ۱۲ |
| ۲ | TABLE ACCESS FULL | EMPLOYEES | ۱۵ | ۸ |
| ۳ | INDEX UNIQUE SCAN | PK_DEPT | ۱ | ۱ |
۱. بررسی نوع دسترسی (Access Method)
TABLE ACCESS FULL→ اسکن کامل جدول؛ پرهزینه است.INDEX RANGE SCAN→ استفاده بهینه از ایندکس؛ معمولاً سریعتر.NESTED LOOPS،HASH JOIN،MERGE JOIN→ هر کدام مزایا و کاربرد خاصی دارند.
۲. بررسی اختلاف بین Estimated Rows و Actual Rows
اگر تفاوت زیاد باشد، نشان از آمار نادرست (Statistics Outdated) دارد.
برای دیدنشان:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
به ستونهای E-Rows (تخمینی) و A-Rows (واقعی) دقت کن.
۳. تحلیل مصرف منابع
سه شاخص حیاتی:
BUFFER_GETS→ خواندن از حافظه.DISK_READS→ خواندن از دیسک؛ هرچه بیشتر، یعنی کندتر.ELAPSED_TIME→ زمان اجرای واقعی.
تشخیص دلایل کندی Query در اوراکل
| علامت | دلیل | راهکار |
|---|---|---|
| TABLE ACCESS FULL | نبود ایندکس یا شرط غیربهینه | ایجاد ایندکس مناسب یا بازنویسی شرط |
| HASH JOIN با Cost بالا | حافظه ناکافی در PGA | افزایش پارامتر pga_aggregate_target |
| تفاوت زیاد A-Rows و E-Rows | آمار قدیمی | اجرای DBMS_STATS.GATHER_TABLE_STATS |
| Nested Loop تکراری | Join Ordering نادرست | بازنویسی Query یا استفاده از Hint مناسب |
مثال کاربردی
Query زیر فرضاً کند اجرا میشود:
SELECT /*+ gather_plan_statistics */
c.customer_name, o.order_id, o.amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.status = 'PENDING'
AND o.order_date > SYSDATE - 30;
مشاهدهی Plan واقعی:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
نتیجه:
اختلاف آماری زیاد نشان میدهد که جدول ORDERS آمار قدیمی دارد.
راهکار اصلاحی:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('APP', 'ORDERS');
END;
/
CREATE INDEX idx_orders_date_status ON orders(order_date, status);
بعد از اجرا مجدد، Plan بهینه میشود و Cost تا حدود ۱۰ برابر کاهش مییابد.
ابزارهای تحلیلی جدید در Oracle 23ai
| ابزار | کاربرد |
|---|---|
| SQL Monitor | نمایش بلادرنگ Query فعال |
| DBMS_XPLAN.DISPLAY_SQL_MONITOR | نمایش وضعیت زنده اجرای SQL |
| AI-Powered SQL Tuning | پیشنهاد خودکار ایندکس و Hint |
| SQL Plan Baselines | نگهداری Planهای بهینه و جلوگیری از Regression |
نکات طلایی برای بهینهسازی عملکرد کوئری در ارواکل
- همیشه از
/*+ GATHER_PLAN_STATISTICS */برای بررسی دقیقتر استفاده کن. - آمارها را مرتب با
DBMS_STATSبهروزرسانی کن. - Queryهای تکراری را با Bind Variable اجرا کن.
- پارامترهای PGA و Optimizer Mode را متناسب با حجم کاری تنظیم کن.
- از SQL Monitor برای Sessionهای سنگین استفاده کن.
سوالات متداول درباره تحلیل Execution Plan در Oracle 23ai
Execution Plan تخمینی (Estimated Plan) فقط نحوه اجرای احتمالی Query را بر اساس آمار فعلی جداول نشان میدهد، بدون آنکه Query واقعاً اجرا شود.
اما Execution Plan واقعی (Actual Plan) در زمان اجرای واقعی Query از طریق DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID', NULL, 'ALLSTATS LAST') تولید میشود و شامل A-Rows، Elapsed Time، Cost و IO واقعی است.
در Oracle 23ai توصیه میشود همیشه Plan واقعی را بررسی کنی تا تفاوت بین تخمین Optimizer و اجرای واقعی را ببینی.
برای تشخیص کندی Query، باید مراحل Plan را از پایین به بالا بررسی کنی و دنبال مراحل با Cost بالا یا Row زیاد بگردی.
اگر TABLE ACCESS FULL روی جدول بزرگ دیده شود یعنی معمولاً ایندکس مؤثر وجود ندارد، و اگر اختلاف بین E-Rows و A-Rows بالا است، نشان از آمار نادرست دارد.
بهترین ابزار برای تحلیل در ۲۳ai، تابع DBMS_XPLAN.DISPLAY_CURSOR و داشبورد SQL Monitor است که اجرای زنده Query را نشان میدهد.
در Oracle، داشتن Execution Plan مشابه لزوماً بهمعنی زمان اجرای برابر نیست.
فاکتورهایی مانند بار سیستم (System Load)، میزان PGA و Cache در لحظه اجرا، و حتی Adaptive Execution باعث تفاوت سرعت میشوند.
در نسخه ۲۳ai، موتور Optimizer ممکن است Plan را حین اجرا (Adaptive) اصلاح کند تا سریعترین مسیر را انتخاب کند، بنابراین بررسی آمار واقعی و بخش Execution Statistics همیشه اهمیت دارد.
روش توصیهشده اوراکل استفاده از SQL Plan Baseline است.
با Baseline میتوانی طرحهای اجرای بهینه را ذخیره و از تغییرات ناخواسته Optimizer در نسخههای جدید یا پس از Gather Stat جلوگیری کنی.
همچنین اجرای منظم DBMS_STATS.GATHER_TABLE_STATS باعث دقت بیشتر در Plan میشود.
در Oracle 23ai این فرآیند با کمک AI-Powered SQL Tuning میتواند حتی بهصورت خودکار انجام شود.
جمعبندی
تحلیل Execution Plan در Oracle ۲۳ai، ابزار اصلی درک رفتار Optimizer و یافتن عوامل کندی است.
با بررسی دقیق Operationها، آمار واقعی (Actual Rows)، و شاخصهای IO و CPU، میتوان هر Query را بهینه کرد.
ترکیب DBMS_XPLAN با AI SQL Tuning در ۲۳ai باعث میشود Tuning در نسل جدید Oracle دقیقتر، هوشمندتر و انسانیتر انجام شود.
📥 اگر سوالی داری در مورد تحلیل Execution Plan در اوراکل داری، در بخش کامنتها بپرس.

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