
در پایگاه داده Oracle، ابزارهای متنوعی برای بهبود عملکرد کوئریها وجود دارد.
اما یکی از کمتر شناختهشدهترین و در عین حال قدرتمندترین ابزارها، پکیج DBMS_SQLDIAG است.
این پکیج مثل یک پزشک هوشمند برای SQL عمل میکند؛ مشکل را تشخیص میدهد، گزارش دقیق تولید میکند و حتی میتواند سناریوی کندی را به شکل تست کیس بازسازی کند.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی در این پکیج DBMS_SQLDIAG صحبت خواهیم کرد.
پکیج DBMS_XPLAN ابزاری رسمی و بسیار توانمند در Oracle برای نمایش و تحلیل Execution Plan محسوب میشود. پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
🎯 هدف و کاربرد اصلی پکیج DBMS_SQLDIAG
در واقع DBMS_SQLDIAG بخش مهمی از SQL Diagnostic Framework در اوراکل است و چند قابلیت اصلی دارد:
| قابلیت | توضیح کاربردی |
|---|---|
| تحلیل SQL | شناسایی علت کند بودن یا رفتار غیرمنتظره دستور SQL |
| تولید گزارش | ارائه توصیهها برای رفع مشکلات عملکردی |
| ساخت تست کیس | بازسازی سناریوی واقعی برای بررسی در محیط دیگر |
| پاکسازی Taskها | حذف تسکهای قبلی جهت مدیریت فضای Advisor |
| پیوند با SQL Tuning | اتصال مستقیم به DBMS_SQLTUNE جهت بهینهسازی خودکار |
اگر بخواهیم خلاصه بگوییم، این پکیج ابزار اصلی DBAها برای شناسایی ریشه مشکلات Performance است.
⚙️ پیشنیاز اجرا پکیج DBMS_SQLDIAG
برای استفاده از این پکیج باید مجوزهای زیر را به کاربر مورد نظر بدهی:
GRANT ADVISOR TO user_name;
GRANT ADMINISTER SQL TUNING SET TO user_name;
این دستورات، دسترسی لازم برای ساخت و اجرای تسکهای تشخیص SQL را فعال میکنند.
🔍 نحوه تحلیل کندی یک کوئری با پکیج DBMS_SQLDIAG
فرض کن در جدول EMPLOYEES یک کوئری کند داری:
SELECT employee_id, first_name, last_name, department_id
FROM employees
WHERE department_id = 50;
حالا با مراحل زیر میفهمی دقیقاً مشکل از کجاست:
۱. ساخت Task تشخیص
DECLARE
l_task VARCHAR2(64);
BEGIN
l_task := DBMS_SQLDIAG.CREATE_DIAGNOSIS_TASK(
sql_text => 'SELECT employee_id, first_name, last_name, department_id FROM employees WHERE department_id = 50',
task_name => 'emp_diag_task1'
);
DBMS_OUTPUT.PUT_LINE('Task created: ' || l_task);
END;
/
۲. اجرای Task
BEGIN
DBMS_SQLDIAG.EXECUTE_DIAGNOSIS_TASK('emp_diag_task1');
END;
/
۳. دریافت گزارش
SET LONG 100000
SELECT DBMS_SQLDIAG.GET_DIAGNOSIS_REPORT('emp_diag_task1') AS report
FROM dual;
📈 خروجی نمونه:
Problem detected: Full Table Scan on EMPLOYEES
Recommendation: Gather statistics or create an index on DEPARTMENT_ID
بدون آنکه از ابزار خارجی استفاده کنی، اوراکل خودش مشکل را تشخیص میدهد و راهحل بهینه را پیشنهاد میکند.
📦 بازتولید خطا با SQL Test Case
گاهی لازم است مشکل را در محیط تست بازسازی کنی.
تابع CREATE_SQL_TESTCASE دقیقاً برای همین کاربرد ساخته شده است:
DECLARE
l_tc VARCHAR2(64);
BEGIN
l_tc := DBMS_SQLDIAG.CREATE_SQL_TESTCASE(
sql_text => 'SELECT * FROM employees WHERE department_id = 50',
test_case_name => 'emp_test_case_50',
export => TRUE,
directory => 'DATA_PUMP_DIR'
);
DBMS_OUTPUT.PUT_LINE('Test case created: ' || l_tc);
END;
/
✅ با اجرا، اوراکل کل بستر اجرای کوئری را در یک فایل فشرده ذخیره میکند، شامل دادهها، آمار (Statistics) و Bindها.
میتوان این فایل را با IMPDP در محیط دیگر ایمپورت کرد تا همان شرایط کندی بازتولید شود.
🧹 حذف Taskها برای جلوگیری از تجمع در سیستم
بعد از تحلیل، همیشه تسکها را حذف کن تا فضای Advisor cache تمیز بماند:
BEGIN
DBMS_SQLDIAG.DROP_DIAGNOSIS_TASK('emp_diag_task1');
END;
/
🔍 بررسی وضعیت Taskها
تمام تسکهای فعال را میتوان از View سیستمی زیر دید:
SELECT task_name, status, created, last_modified
FROM dba_advisor_tasks
WHERE advisor_name = 'SQL Diagnosis Advisor';
یا برای مشاهده یافتهها و پیشنهادها:
SELECT task_name, finding, recommendation
FROM dba_advisor_findings
WHERE task_name = 'emp_diag_task1';
🔗 پیوند پکیج DBMS_SQLDIAG با SQL Tuning Advisor
بعد از تشخیص مشکل، میتوان همان SQL را برای بهینهسازی خودکار به پکیج DBMS_SQLTUNE سپرد:
DECLARE
l_tune_task VARCHAR2(64);
BEGIN
l_tune_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => 'SELECT employee_id, first_name, last_name, department_id FROM employees WHERE department_id = 50',
task_name => 'tune_emp_task',
user_name => 'HR'
);
DBMS_SQLTUNE.EXECUTE_TUNING_TASK('tune_emp_task');
END;
/
بدین ترتیب، یک چرخه کامل از تشخیص، تحلیل و بهینهسازی خودکار شکل میگیرد.
💬 نکات حرفهای DBAها
- قبل از Diagnosis، مطمئن شو آمار جداول بهروز هستند
- نام تسکها را با تاریخ بساز (مثلاً
diag_emp_2025_11) - در محیطهای Multi-Tenant diagnosis باید در
CDB$ROOTانجام شود - گزارش خروجی مناسب مستندسازی برای تیم مدیریت یا Change Requests است
سوالات متداول درباره پکیج DBMS_SQLDIAG در اوراکل
پکیج DBMS_SQLDIAG یکی از ابزارهای تخصصی اوراکل برای تشخیص مشکلات عملکردی SQL است.
این پکیج رفتار کوئریها را بررسی میکند، علت کندی یا تفاوت در Execution Plan را مشخص کرده و گزارش دقیق به همراه پیشنهاد اصلاح تولید میکند.
از این پکیج معمولاً DBAها برای عیبیابی، بررسی Full Table Scan، و ایجاد SQL Test Case استفاده میکنند.
DBMS_SQLDIAG وظیفه دارد خطا یا مشکل موجود در SQL را تشخیص دهد (Diagnosis)، در حالی که DBMS_SQLTUNE مرحلهی بعد یعنی بهینهسازی (Tuning) را انجام میدهد.
بهبیان ساده:
DBMS_SQLDIAG→ میگوید مشکل از کجاست.DBMS_SQLTUNE→ پیشنهاد میدهد چطور رفعش کنی.
برای تحلیل عملکرد یک SQL خاص میتوان با تابع زیر تسک تشخیص ساخت:
DECLARE
l_task VARCHAR2(64);
BEGIN
l_task := DBMS_SQLDIAG.CREATE_DIAGNOSIS_TASK(
sql_text => ‘SELECT * FROM employees WHERE department_id = 50’,
task_name => ’emp_diag_task1′
);
DBMS_SQLDIAG.EXECUTE_DIAGNOSIS_TASK(’emp_diag_task1′);
END;
سپس خروجی با DBMS_SQLDIAG.GET_DIAGNOSIS_REPORT دریافت میشود. این گزارش علت دقیق کندی، آمار جدول، و پیشنهاد ایجاد ایندکس را نشان میدهد.
SQL Test Case مجموعهای از دادهها و تنظیمات سیستم است که شرایط اجرای یک Query را بازسازی میکند.
با استفاده از تابع CREATE_SQL_TESTCASE میتوان فایل فشردهای از محیط واقعی ساخت و آن را به سرور تست ارسال کرد:
DBMS_SQLDIAG.CREATE_SQL_TESTCASE(
sql_text => ‘SELECT * FROM employees WHERE department_id=50’,
export => TRUE,
directory => ‘DATA_PUMP_DIR’
);
این فایل در مسیر DATA_PUMP_DIR ذخیره میشود و برای تیم پشتیبانی (Support) قابل اجراست.
جمعبندی
پکیج DBMS_SQLDIAG ابزار قدرتمند اوراکل برای تشخیص دقیق مشکلات SQL است.
از بررسی Full Scanها تا تولید تست کیس، همهچیز را در اختیار DBA قرار میدهد تا به جای حدس و آزمایش، با تحلیل دقیق تصمیم بگیرد.
اگر دنبال راهی هستی که کوئریهایت مثل موتور اسپرت اجرا شوند، DBMS_SQLDIAG کلید آن است — ابزاری هوشمند، دقیق و ویژه متخصصان Performance Tuning.
📥 اگر سوالی داری در مورد پکیج DBMS_SQLDIAG در اوراکل داری، در بخش کامنتها بپرس.

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