
مقدمه : استفاده از پکیج 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 دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید