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

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

آموزش کامل پکیج DBMS_STATS در اوراکل + مثال عملی

مقدمه : استفاده از پکیج DBMS_STATS در اوراکل چه اهمیتی دارد؟

در دنیای بانک‌های اطلاعاتی اوراکل (Oracle Database)، یکی از مهم‌ترین ابزارها برای بهبود عملکرد کوئری‌ها، جمع‌آوری دقیق آمار (Statistics) است.

در این مقاله آموزش اوراکل استفاده از DBMS_STATS می‌توانیم آمار مربوط به اندازه جداول، توزیع داده‌ها، تعداد رکوردها و اطلاعاتی که به بهینه‌ساز (Optimizer) کمک می‌کند را جمع‌آوری کنیم.

نتیجه‌ی این کار اجرای سریع‌تر و بهینه‌تر کوئری‌ها خواهد بود.

اگر می خواهید در مورد پکیج DBMS_UTILITY در بخش آموزش PL/SQL بیشتر آشنا بشید نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

DBMS_STATS چیست؟

DBMS_STATS یک پکیج سیستمی در Oracle Database هست که برای جمع‌آوری و مدیریت آمار جداول، اندکس‌ها و اسکیمات استفاده میشه.

این آمار به بهینه‌ساز (Optimizer) کمک می‌کنه تا بهترین برنامه اجرایی (Execution Plan) رو برای کوئری‌ها انتخاب کنه.

قبل از Oracle 8i، از ANALYZE استفاده می‌شد ولی الان DBMS_STATS روش استاندارد و توصیه شده است.

پروسیجرها و فانکشن‌های پکیج DBMS_STATS در اوراکل

در ادامه، به صورت جامع و با ارائه‌ی مثال‌های واقعی، تمام پروسیجرها و فانکشن‌های مهم DBMS_STATS را بررسی می‌کنیم.

۱. GATHER_TABLE_STATS: جمع آوری آمار جدول

با استفاده از این پروسیجر می‌توانیم آمار یک جدول خاص را جمع‌آوری کنیم.

کد نمونه:

				
					BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(
    ownname => 'HR',
    tabname => 'EMPLOYEES',
    cascade => TRUE
  );
END;
/

				
			

توضیح:

  • ownname: نام اسکیمای مربوطه
  • tabname: نام جدول
  • cascade: اگر TRUE باشد، آمار ایندکس‌های مربوطه نیز جمع‌آوری می‌شود.

۲. GATHER_SCHEMA_STATS: جمع آوری آمار کل اسکیمای Oracle

کد نمونه:

				
					BEGIN
  DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'HR');
END;
/

				
			

توضیح:
با این پروسیجر، تمام جداول و ایندکس‌های اسکیمای HR بروزرسانی می‌شوند.

۳. GATHER_DATABASE_STATS: جمع آوری آمار کل دیتابیس

برای بهینه‌سازی دیتابیس در سطح کلی از این پروسیجر استفاده می‌شود.

کد نمونه:

				
					BEGIN
  DBMS_STATS.GATHER_DATABASE_STATS;
END;
/

				
			

۴. GATHER_INDEX_STATS: جمع آوری آمار ایندکس

گاهی فقط نیاز به بروزرسانی آمار یک ایندکس خاص داریم.

کد نمونه:

				
					BEGIN
  DBMS_STATS.GATHER_INDEX_STATS(
    ownname => 'HR',
    indname => 'EMPLOYEE_IDX'
  );
END;
/

				
			

۵. GATHER_SYSTEM_STATS: جمع آوری آمار سیستم

آمار سیستمی مثل سرعت CPU یا IO برای اجرای کوئری‌های سنگین بسیار اهمیت دارد.

کد نمونه:

				
					BEGIN
  DBMS_STATS.GATHER_SYSTEM_STATS('NOWORKLOAD');
END;
/

				
			

NOWORKLOAD: بدون نیاز به بارگذاری واقعی سیستم را آنالیز می‌کند.

۶. DELETE_TABLE_STATS: حذف آمار جدول

کد نمونه:

				
					BEGIN
  DBMS_STATS.DELETE_TABLE_STATS(
    ownname => 'HR',
    tabname => 'EMPLOYEES'
  );
END;
/

				
			

توضیح:
با این دستور، آمار مربوط به جدول HR.EMPLOYEES حذف می‌شود.

۷. LOCK_TABLE_STATS و UNLOCK_TABLE_STATS: قفل یا باز کردن آمار

برای جلوگیری از تغییرات ناخواسته روی آمار جداول، می‌توانیم آن‌ها را قفل کنیم.

قفل کردن آمار:

				
					BEGIN
  DBMS_STATS.LOCK_TABLE_STATS('HR', 'EMPLOYEES');
END;
/

				
			

آزاد کردن آمار:

				
					BEGIN
  DBMS_STATS.UNLOCK_TABLE_STATS('HR', 'EMPLOYEES');
END;
/

				
			

۸. EXPORT_SCHEMA_STATS و IMPORT_SCHEMA_STATS: بکاپ و بازیابی آمار

بکاپ گیری آمار:

				
					BEGIN
  DBMS_STATS.EXPORT_SCHEMA_STATS(
    ownname => 'HR',
    stattab => 'HR_STATS_BACKUP'
  );
END;
/

				
			

بازیابی آمار:

				
					BEGIN
  DBMS_STATS.IMPORT_SCHEMA_STATS(
    ownname => 'HR',
    stattab => 'HR_STATS_BACKUP'
  );
END;
/

				
			

نکته:
قبل از Export باید جدول مخصوص بکاپ را با DBMS_STATS.CREATE_STAT_TABLE بسازیم.

۹. GET_PREFS و SET_PREFS: مدیریت تنظیمات پیش فرض آمارگیری

گرفتن مقدار تنظیم پیش‌فرض:

				
					SELECT DBMS_STATS.GET_PREFS('CASCADE', 'HR', 'EMPLOYEES') FROM dual;

				
			

تنظیم مقدار جدید:

				
					BEGIN
  DBMS_STATS.SET_TABLE_PREFS(
    ownname => 'HR',
    tabname => 'EMPLOYEES',
    pname   => 'CASCADE',
    pvalue  => 'TRUE'
  );
END;
/

				
			

خلاصه توابع پکیج DBMS_STATS

عملیات پروسیجر / فانکشن
جمع‌آوری آمار جدول GATHER_TABLE_STATS
جمع‌آوری آمار اسکیمای کامل GATHER_SCHEMA_STATS
جمع‌آوری آمار دیتابیس GATHER_DATABASE_STATS
جمع‌آوری آمار ایندکس GATHER_INDEX_STATS
جمع‌آوری آمار سیستم GATHER_SYSTEM_STATS
حذف آمار DELETE_TABLE_STATS
قفل یا باز کردن آمار LOCK_TABLE_STATS / UNLOCK_TABLE_STATS
بکاپ/ریستور آمار EXPORT_SCHEMA_STATS / IMPORT_SCHEMA_STATS
تنظیم پیش‌فرض SET_PREFS / GET_PREFS

نکات مهم برای استفاده بهتر از DBMS_STATS

  • اگر حجم داده زیاد است، مقدار estimate_percent را کاهش دهید تا زمان جمع‌آوری آمار کمتر شود.
  • برای جداول حساس، حتما از پروسیجرهای EXPORT_SCHEMA_STATS جهت بکاپ گیری آمار استفاده کنید.
  • قفل کردن آمار با LOCK_TABLE_STATS از تغییرات ناخواسته توسط برنامه نویسان جلوگیری می‌کند.
  • آمار سیستم (GATHER_SYSTEM_STATS) تاثیر مستقیم روی سرعت و بهینه‌سازی کوئری‌های سنگین دارد.

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

DBMS_STATS روش مدرن، استاندارد و توصیه شده توسط Oracle است. ANALYZE منسوخ شده است.

بسته به تغییرات داده‌ها، معمولا هفته‌ای یکبار یا بعد از تغییرات عمده.

خیر، برای جداول کوچک هم استفاده می‌شود ولی تاثیرش در جداول بزرگ بیشتر مشهود است.

نتیجه‌گیری: چرا باید DBMS_STATS را جدی بگیریم؟

استفاده صحیح از پکیج DBMS_STATS باعث می‌شود:

  • کوئری‌های اوراکل سریع‌تر اجرا شوند.
  • مصرف منابع سخت‌افزاری (CPU, RAM, I/O) بهینه شود.
  • ریسک کند شدن سیستم‌های حیاتی کاهش یابد.

به همین دلیل، دانستن دقیق کار با DBMS_STATS برای هر DBA یا برنامه نویس Oracle یک مهارت حیاتی محسوب می‌شود.

📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از پکیج DBMS_UTILITY دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

میثم راد

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

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

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