ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش عملی پکیج DBMS_SQLTUNE برای بهینه‌سازی کوئری‌های سنگین

سلام به همه‌ی برنامه نویس های عزیز 👋

اگه تاحالا با کوئری‌هایی سروکله زدی که کند و اعصاب‌خردکن هستن و هر کاری می‌کنی Query Plan مثل لاک‌پشت جلو میره، باید بدونی وقت استفاده از پکیج جادویی DBMS_SQLTUNE هست!

این ابزار رسمی Oracle Database از نسخه‌ی ۱۰g معرفی شد و الان توی نسخه‌های ۱۹c و ۲۳ai هم جزو اجزای حیاتی Performance Tuning حساب میشه.

در ابن مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی بریم با یه مثال واقعی یاد بگیریم چطور باهاش یه کوئری کند رو درمان کنیم.

در دنیای امروزی که ارتباطات نرم‌افزارها از طریق شبکه حرف اول را می‌زند، اوراکل هم برای توسعه‌دهندگانی که به ارتباطات سطح پایین نیاز دارند، ابزار قدرتمندی در اختیار گذاشته: پکیجی به نام UTL_TCP.

پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.

در این مقاله شما می خوانید

فرآیندها و توابع پکیج DBMS_SQLTUNE در اوراکل

عمل تابع / پروسیجر توضیح کوتاه
ایجاد Task CREATE_TUNING_TASK ایجاد جلسه تحلیل SQL برای بررسی عملکرد.
اجرای Task EXECUTE_TUNING_TASK اجرای تحلیل و شروع فرآیند Tuning.
گزارش REPORT_TUNING_TASK مشاهده گزارش نهایی SQL Tuning Advisor.
حذف DROP_TUNING_TASK حذف Task‌های قدیمی از SYSAUX Repository.
بررسی وضعیت GET_TUNING_TASK_STATUS نمایش وضعیت فعلی Task (Completed, Running,...)
اعمال SQL Profile ACCEPT_SQL_PROFILE اعمال توصیه SQL Profile برای Query بهینه‌تر.
اجرای سریع TUNE_SQL ساخت و اجرای خودکار Tuning Task در یک مرحله.

🎯 سناریوی واقعی: کوئری کند در سیستم بیمه

فرض کن توی سیستم بیمه یه گزارش داریم که اطلاعات از جدول CLAIM_HISTORY میاره و همیشه کند اجرا میشه.

ما فقط SQL ID اون رو داریم و قراره به کمک پکیج DBMS_SQLTUNE آنالیزش کنیم.

🔹 مرحله ۱: ساخت Task برای SQL Tuning

				
					DECLARE
  v_task VARCHAR2(100);
BEGIN
  v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
    sql_id      => '۴۰q2m9p1z6dqw',
    scope       => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE,
    time_limit  => ۱۲۰,
    task_name   => 'claim_tune_task',
    description => 'Tuning report for slow insurance claim query');
  DBMS_OUTPUT.PUT_LINE('Created tuning task: ' || v_task);
END;
/

				
			

🔸 این کد درواقع یه پرونده‌ی «تحلیل عملکرد» ایجاد می‌کنه. پارامتر SCOPE_COMPREHENSIVE باعث میشه Advisor همه‌چیز از Statistics تا Index و Profile رو بررسی کنه.

🔹 مرحله ۲: اجرای Task

				
					EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK('claim_tune_task');

				
			

این دستور تحلیل رو اجرا می‌کنه. معمولاً بسته به پیچیدگی کوئری، بین چند ثانیه تا چند دقیقه طول می‌کشه.

🔹 مرحله ۳: مشاهده گزارش SQL Tuning Advisor

				
					SET LONG 10000
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('claim_tune_task') AS report FROM dual;

				
			

نمونه‌ی خلاصه خروجی:

				
					۱. Statistics Finding:
   Missing or stale optimizer statistics on CLAIM_HISTORY.

۲. Index Finding:

۳. SQL Profile Finding:
				
			

🔹 مرحله ۴: اعمال SQL Profile توصیه‌شده

				
					EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE('claim_tune_task', 'CLAIM_SQL_PROFILE');

				
			

با اجرای این دستور، SQL Optimizer از این به بعد Plan بهینه‌تری انتخاب می‌کنه، بدون اینکه حتی یک خط از کد برنامه‌ات تغییر کنه.

🔹 مرحله ۵: حذف Task (مرحله پاکسازی)

				
					EXEC DBMS_SQLTUNE.DROP_TUNING_TASK('claim_tune_task');

				
			

💡 بررسی SQL Profile جدید

				
					SELECT NAME, STATUS FROM DBA_SQL_PROFILES WHERE NAME='CLAIM_SQL_PROFILE';

				
			

نتیجه:

				
					NAME               STATUS
------------------ --------
CLAIM_SQL_PROFILE  ENABLED

				
			

به همین راحتی، اجرای کوئری از ۳۰ ثانیه رسیده به کمتر از ۵ ثانیه!

بدون تغییر در کد، فقط با قدرت DBMS_SQLTUNE 🔥

👨‍🔧 خلاصهٔ حرفه‌ای برای DBAها

  • CREATE_TUNING_TASK → ساخت جلسه‌ی تحلیل
  • EXECUTE_TUNING_TASK → اجرای آنالیز
  • REPORT_TUNING_TASK → تولید گزارش توصیه‌ها
  • ACCEPT_SQL_PROFILE → اعمال توصیه‌ها
  • DROP_TUNING_TASK → تمیزکاری و حذف Task

⚡ نکات طلایی تجربه‌ای

  • از TUNE_SQL برای تست سریع Queryها در محیط تست استفاده کن.
  • همیشه قبل از اعمال SQL Profile در محیط Production، خروجی Plan جدید رو با DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE مقایسه کن.
  • فراموش نکن DBMS_SQLTUNE دیتاها رو در SYSAUX tablespace ذخیره می‌کنه؛ پس مراقب حجمش باش.

سوالات متداول درباره پکیج DBMS_SQLTUNE در اوراکل

پکیج DBMS_SQLTUNE در واقع رابط PL/SQL برای SQL Tuning Advisor است.

یعنی هر کاری که SQL Tuning Advisor از طریق Enterprise Manager انجام می‌دهد، با DBMS_SQLTUNE می‌توان از طریق کدنویسی کنترل کرد.

با این پکیج می‌توانی Task بسازی، آن را اجرا کنی، گزارش بگیری و حتی SQL Profile را مستقیم Apply کنی.

بنابراین DBMS_SQLTUNE ابزاری برای اتومات‌سازی و اجرای دستوری SQL Tuning است، درحالی‌که SQL Tuning Advisor رابط گرافیکی همان فرآیند محسوب می‌شود.

SQL Profile در اصل یک مجموعه Optimizer Hint نیمه‌خودکار است که رفتار Cost-Based Optimizer را اصلاح می‌کند.

یعنی به جای تغییر در ساختار پایگاه داده، به Optimizer کمک می‌کند تصمیم بهتری برای Execution Plan بگیرد.

اما SQL Profile جایگزین ایندکس نیست. اگر Bottleneck از نوع Access Path باشد، باید ایندکس فیزیکی بسازی.

بهترین روش این است که ابتدا خروجی DBMS_SQLTUNE را بررسی و اگر پیشنهاد ساخت Index داده بود، آن را اعمال کنی؛ سپس در مرحله‌ی بعد SQL Profile را فعال نگه داری.

پارامتر scope مشخص می‌کند Oracle چه سطحی از تحلیل را انجام دهد:

  • SCOPE_LIMITED: بررسی ساده‌ی آمار و Plan فعلی. سریع‌تر ولی کم‌عمق.
  • SCOPE_COMPREHENSIVE: تحلیل پیشرفته شامل پیشنهاد ایندکس، جمع‌آوری آمار جدید، تست SQL Profile و حتی شبیه‌سازی Planهای جایگزین.

اگر هدفت تحلیل عمیق یک Query مهم یا Production باشد، COMPREHENSIVE انتخاب بهتری است (البته با هزینه زمانی و CPU بیشتر).

برای بررسی اینکه آیا SQL Profile روی کوئری خاص فعال شده، می‌توانی از این Query استفاده کنی: 

SELECT sql_profile, sql_text
FROM v$sql
WHERE sql_id = ’40q2m9p1z6dqw’;

اگر ستون SQL_PROFILE مقدار داشت (مثلاً ‘CLAIM_SQL_PROFILE’)، یعنی به صورت موفق روی Plan فعلی اعمال شده.

همچنین جدول DBA_SQL_PROFILES تمام Profileهای فعال را نمایش می‌دهد و می‌توانی ببینی آیا حالت ENABLED دارند یا نه.

جمع‌بندی

پکیج DBMS_SQLTUNE یه ابزار ساده ولی فوق‌العاده عمیقه. به جای حدس زدن در مورد ایندکس، Optimizer خودش بر اساس آمار و Cost واقعی تصمیم می‌گیره.

اگه یه DBA حرفه‌ای هستی یا تازه تو دنیای Performance Tuning وارد شدی، یاد گرفتن این پکیج مثل افزایش قدرت دید در Matrixه؛ همه‌چیز واضح‌تر میشه! 🎬

📥 اگر سوالی داری در مورد پکیج DBMS_SQLTUNE در اوراکل داری، در بخش کامنت‌ها بپرس.

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *