
در پایگاه داده 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 در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید