
اگر DBA یا توسعهدهندهی اوراکل باشی، احتمالاً بارها با این سؤال مواجه شدی:
«چرا این کوئری کنده و دقیقاً چی کار کنم بهتر بشه؟»
اینجاست که پکیج قدرتمند DBMS_ADVISOR وارد بازی میشود؛ پکیجی که مغز متفکر بسیاری از ابزارهای تحلیلی Oracle مثل SQL Tuning Advisor، SQL Access Advisor و Segment Advisor است.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی، DBMS_ADVISOR را واقعی، کاربردی و بدون پیچیدگی مصنوعی یاد میگیری.
پکیج DBMS_TRACE یکی از ابزارهای کمتر مطرحشده اما فوقالعاده قدرتمند در Oracle است که امکان ردگیری مرحلهبهمرحله مسیر اجرای کدهای PL/SQL را فراهم میکند. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
پکیج DBMS_ADVISOR چیست و چرا مهم است؟
DBMS_ADVISOR یک پکیج سیستمی در Oracle Database است که برای تحلیل عملکرد (Performance Analysis) و ارائهی پیشنهادهای قابل اجرا طراحی شده است.
بهصورت خلاصه، این پکیج به اوراکل اجازه میدهد:
- رفتار کوئریها را تحلیل کند
- ساختار داده را بررسی کند
- پیشنهادهایی مثل ساخت Index یا اصلاح دسترسی به داده بدهد
🔹 نکته مهم:
هر بار که در Oracle Enterprise Manager روی «Run Advisor» کلیک میکنی، در واقع DBMS_ADVISOR پشت صحنه در حال اجراست.
ارتباط DBMS_ADVISOR با Advisorهای معروف اوراکل
Advisorهایی که میشناسیم، در اصل orchestration شده توسط DBMS_ADVISOR هستند:
- SQL Tuning Advisor → بهینهسازی یک SQL خاص
- SQL Access Advisor → پیشنهاد Index و Materialized View
- Segment Advisor → شناسایی segmentهای بلااستفاده و حجم آزادشدنی فضا
- Memory Advisor
- Undo Advisor
DBMS_ADVISOR هستهی مشترک همهی این تحلیلهاست.
معماری داخلی DBMS_ADVISOR
برای فهم درست این پکیج، باید این ساختار را بشناسی:
Advisor
└── Task
└── Object
└── Execution
└── Recommendation
توضیح ساده:
- Advisor: نوع تحلیل
- Task: یک job تحلیلی مشخص
- Object: جدول، ایندکس یا SQL
- Recommendation: خروجی و پیشنهاد نهایی
سناریوی واقعی: آیا به Index جدید نیاز داریم؟
فرض کن جدول ORDERS کوئریهای سنگینی دارد و شک داریم Index مناسب وجود دارد یا نه.
بهترین انتخاب: SQL Access Advisor
گام اول: ساخت Task در DBMS_ADVISOR
BEGIN
DBMS_ADVISOR.create_task (
advisor_name => DBMS_ADVISOR.SQLACCESS_ADVISOR,
task_name => 'SA_ORDERS_TASK',
task_desc => 'Analyze access paths for ORDERS'
);
END;
/
در این مرحله فقط Task ساخته میشود؛ هنوز تحلیلی انجام نشده.
گام دوم: اضافهکردن جدول به Task
BEGIN
DBMS_ADVISOR.add_object (
task_name => 'SA_ORDERS_TASK',
object_type => 'TABLE',
attr1 => 'HR',
attr2 => 'ORDERS'
);
END;
/
میتوان چندین جدول یا حتی SQL Statement اضافه کرد.
گام سوم: تنظیم پارامترهای تحلیل
BEGIN
DBMS_ADVISOR.set_task_parameter(
task_name => 'SA_ORDERS_TASK',
parameter => 'ANALYSIS_SCOPE',
value => 'ALL'
);
DBMS_ADVISOR.set_task_parameter(
task_name => 'SA_ORDERS_TASK',
parameter => 'MODE',
value => 'COMPREHENSIVE'
);
END;
/
گام چهارم: اجرای Task
BEGIN
DBMS_ADVISOR.execute_task('SA_ORDERS_TASK');
END;
/
از این لحظه، اوراکل رفتار workload را تحلیل میکند.
مشاهده وضعیت Task
SELECT task_name, status
FROM dba_advisor_tasks
WHERE task_name = 'SA_ORDERS_TASK';
دیدن Recommendationها (مهمترین بخش)
SELECT *
FROM dba_advisor_recommendations
WHERE task_name = 'SA_ORDERS_TASK';
نمونه نتیجه:
- پیشنهاد:
CREATE INDEX HR.IDX_ORDERS_CUSTOMER_ID - بهبود تخمینی: ۶۵٪
🔹 یعنی اوراکل میگوید اگر این Index را بسازی، دسترسی به داده بسیار سریعتر میشود.
گرفتن گزارش نهایی
گزارش متنی
SELECT DBMS_ADVISOR.get_task_report(
'SA_ORDERS_TASK',
'TEXT',
'ALL'
)
FROM dual;
گزارش HTML (مناسب مرورگر)
SELECT DBMS_ADVISOR.get_task_report(
'SA_ORDERS_TASK',
'HTML',
'ALL'
)
FROM dual;
پاکسازی Task پس از اتمام کار
BEGIN
DBMS_ADVISOR.delete_task('SA_ORDERS_TASK');
END;
/
عدم حذف Taskها باعث شلوغ شدن Data Dictionary میشود.
مهمترین پروسیجرها و فانکشنهای DBMS_ADVISOR
create_taskadd_objectset_task_parameterexecute_taskget_task_reportdelete_taskreset_task
اشتباهات رایج در استفاده از DBMS_ADVISOR
- اجرای Advisor بدون statistics بهروز
- اعتماد صددرصدی به recommendation
- اجرای COMPREHENSIVE در محیط Production شلوغ
- ساخت Index بدون بررسی execution plan
✅ DBA تصمیمگیر نهایی است، Advisor فقط راهنماست.
سوالات متداول درباره پکیج DBMS_ADVISOR در اوراکل
DBMS_ADVISOR یک پکیج سیستمی در Oracle Database است که برای تحلیل performance دیتابیس و ارائهی پیشنهادهای بهینهسازی استفاده میشود.
این پکیج هستهی اصلی ابزارهایی مثل SQL Tuning Advisor، SQL Access Advisor و Segment Advisor است و میتواند پیشنهادهایی مانند ساخت Index، اصلاح مسیرهای دسترسی (Access Path) و بهبود استفاده از منابع را ارائه دهد.
DBMS_ADVISOR بیشتر توسط DBAها برای تصمیمگیری دقیق و مستند در SQL Tuning استفاده میشود.
SQL Access Advisor بیشتر روی ساختار داده تمرکز دارد، یعنی بررسی میکند آیا به Index جدید، حذف Index قدیمی یا حتی Materialized View نیاز هست یا نه.
در مقابل، SQL Tuning Advisor روی یک SQL مشخص کار میکند و پیشنهادهایی مثل SQL Rewrite، Hint یا Profile ارائه میدهد.
به زبان ساده:
- SQL Access Advisor → چی بسازیم؟ (Index / MV)
- SQL Tuning Advisor → کوئری چطور بهتر نوشته یا اجرا شود؟
هر دو از طریق پکیج DBMS_ADVISOR اجرا میشوند اما هدفشان متفاوت است.
بله، اما با احتیاط. اجرای DBMS_ADVISOR، مخصوصاً در حالت MODE = COMPREHENSIVE، میتواند روی منابع سیستم (CPU و I/O) فشار وارد کند. به همین دلیل توصیه میشود:
- در ساعات کمبار اجرا شود
- قبل از اجرا، Statistics بهروز باشند
- روی سیستمهای شلوغ، ابتدا در محیط Test بررسی شود
DBA حرفهای همیشه خروجی Advisor را بررسی میکند، نه اینکه کورکورانه اجرا کند.
خیر. پیشنهادهای DBMS_ADVISOR راهنما هستند، نه دستور.
ممکن است یک Index پیشنهادی برای یک کوئری مفید باشد ولی:
- روی DML اثر منفی بگذارد
- باعث افزایش مصرف فضا شود
- با logic برنامه همخوانی نداشته باشد
بهترین کار این است که:
- پیشنهاد بررسی شود
- execution plan مقایسه شود
- تاثیر روی workload کلی سنجیده شود
در نهایت، تصمیم نهایی همیشه با DBA یا معمار دیتابیس است.
جمعبندی
DBMS_ADVISOR ابزاری است که اگر درست از آن استفاده شود:
- سرعت SQL Tuning چند برابر میشود
- تصمیمها منطقی و مستند میشوند
- آزمون و خطا به حداقل میرسد
یک DBA حرفهای بدون شناخت DBMS_ADVISOR، ابزار اصلی تحلیل Oracle را از دست داده است.
📥 اگر سوالی داری در مورد پکیج DBMS_ADVISOR در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید