
اگر با پایگاه داده اوراکل کار کرده باشی، حتماً اسم Materialized View به گوشت خورده. این ساختار، در واقع یک جدول ذخیرهشده از نتایج یک Query است که میتونه به صورت دورهای یا دستی آپدیت بشه.
حالا، برای مدیریت این MVها، اوراکل یک جعبهابزار طلایی به اسم DBMS_MVIEW داده که باهاش میتونی MV بسازی، بروزرسانی کنی، بررسی کنی که آیا Query قابل بازنویسی (Rewrite) با MV هست یا نه، و حتی Refresh رو گروهبندی کنی.
در این مقاله آموزش اوراکل از بخش آموزش پکیج های اوراکلی بریم با هم یکبار برای همیشه این پکیج رو قدم به قدم یاد بگیریم.
اگر شما DBA، برنامهنویس، یا حتی مدیر IT باشید، احتمالاً تجربه کردید که بعضی گزارشهای سنگین میتوانند کل سیستم پایگاه داده را به زانو دربیاورند. این جاست که Materialized View میاد وسط کار. پیشنهاد می شود نوشته زیر را مطالعه کنید:
در این مقاله شما می خوانید
وظیفه DBMS_MVIEW چیه؟
DBMS_MVIEW این قابلیتها رو میده:
- Refresh کردن یک یا چند MV (به صورت کامل، سریع یا اجباری)
- تست امکان استفاده از Query Rewrite
- کنترل تازهبودن دادهها (Freshness)
- ایجاد و مدیریت گروههای Refresh
- بررسی وابستگیها و قابلیت Fast Refresh
- بهینهسازی Queryهای سنگین
بروزرسانی (Refresh) MVها
مهمترین وظیفه این پکیج، بروزرسانی (ریفرش) کردن دادههاست.
۱. DBMS_MVIEW.REFRESH
| پروسیجر / فانکشن | توضیح | پارامترها | مثال |
|---|---|---|---|
| DBMS_MVIEW.REFRESH | بروزرسانی MV با روشهای مختلف (F, C, P) | list, method, atomic_refresh |
BEGIN
DBMS_MVIEW.REFRESH('MV_SALES', 'F');
END;
|
| DBMS_MVIEW.EXPLAIN_MVIEW | تحلیل قابلیتهای MV برای Query Rewrite | mview_name, statement_id |
BEGIN
DBMS_MVIEW.EXPLAIN_MVIEW('MV_CUSTOMERS');
END;
|
BEGIN
DBMS_MVIEW.REFRESH(
list => 'SALES_MV',
method => 'F'
);
END;
۲. DBMS_MVIEW.REFRESH_ALL_MVIEWS (بروزرسانی همه MVها)
BEGIN
DBMS_MVIEW.REFRESH_ALL_MVIEWS;
END;
۳. DBMS_MVIEW.REFRESH_DEPENDENT (برورسانی MV های وابسته)
اگر MVهایی داری که به یک جدول خاص وابستهاند:
BEGIN
DBMS_MVIEW.REFRESH_DEPENDENT(
base_table_name => 'SALES'
);
END;
بررسی و آنالیز MV
DBMS_MVIEW.EXPLAIN_MVIEW
با این دستور میفهمی MV چه قابلیتهایی دارد.
CREATE TABLE mv_analysis AS
SELECT NULL statement_id, NULL mv_owner, NULL mv_name, NULL capability_name,
NULL possible, NULL related_text, NULL msgno, NULL message
FROM dual WHERE 1=0;
و
BEGIN
DBMS_MVIEW.EXPLAIN_MVIEW(
mv_name => 'SALES_MV',
stmt_id => 'TEST1'
);
END;
DBMS_MVIEW.EXPLAIN_REWRITE
برای بررسی اینکه آیا Oracle میتواند Query شما را با MV اجرا کند:
CREATE TABLE rewrite_analysis AS
SELECT NULL statement_id, NULL query_txt, NULL possible, NULL msgno, NULL message
FROM dual WHERE 1=0;
BEGIN
DBMS_MVIEW.EXPLAIN_REWRITE(
query => 'SELECT SUM(amount_sold) FROM sales',
mv => 'SALES_MV',
stmt_id => 'RW1'
);
END;
بررسی پارامتر Fast Refresh
DECLARE
res VARCHAR2(10);
BEGIN
DBMS_MVIEW.EXPLAIN_FAST_REFRESH(
mv => 'SALES_MV',
result => res
);
DBMS_OUTPUT.PUT_LINE('Fast Refresh Possible: ' || res);
END;
پکیج DBMS_REFRESH — بروزرسانی (Refresh) گروهی
فرض کن چند MV داری که باید همزمان آپدیت شن.
- ایجاد گروه:
BEGIN
DBMS_REFRESH.MAKE(
name => 'RGROUP1',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1/24',
implicit_destroy => TRUE
);
END;
- اضافه کردن MV:
DBMS_REFRESH.ADD('RGROUP1', 'SALES_MV');
- بروزرسانی (ریفرش) گروه:
DBMS_REFRESH.REFRESH('RGROUP1');
بررسی Freshness و وابستگیها
چند تابع عالی برای چک کردن وضعیت MV:
SELECT DBMS_MVIEW.GET_MV_REFRESH_TIME('SALES_MV') FROM dual;
یا:
SELECT DBMS_MVIEW.GET_MV_INFO('SALES_MV') FROM dual;
پیشنیاز پارامتر Fast Refresh
- ایجاد Materialized View Log:
CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE (amount_sold, ...)
INCLUDING NEW VALUES;
- ساخت MV با Fast Refresh:
CREATE MATERIALIZED VIEW sales_mv
REFRESH FAST ON DEMAND
AS SELECT amount_sold, COUNT(*) FROM sales GROUP BY amount_sold;
سوالات متداول درباره پکیج DBMS_MVIEW در اوراکل
DBMS_MVIEW یک پکیج سیستمی اوراکل است که برای مدیریت Materialized Views استفاده میشود.
با این پکیج میتوان MVها را بروزرسانی (Refresh) کرد، امکان Fast Refresh را بررسی نمود، قابلیت Query Rewrite را تست کرد و حتی چند MV را به صورت گروهبندیشده بروزرسانی نمود.
این ابزار برای DBAها حیاتی است تا سرعت گزارشها و Queryها را بهبود دهند.
- Fast Refresh: فقط تغییرات جدید جداول پایه را اعمال میکند و به Materialized View Log نیاز دارد.
- Complete Refresh: کل دیتا را از ابتدا بازسازی میکند، که زمان بیشتری میبرد اما نیاز به MV Log ندارد.
حرفهایها تا جای ممکن از Fast Refresh استفاده میکنند چون سریعتر و بهینهتر است.
میتوانید از متد DBMS_MVIEW.EXPLAIN_FAST_REFRESH استفاده کنید:
DECLARE
res VARCHAR2(10);
BEGIN
DBMS_MVIEW.EXPLAIN_FAST_REFRESH(mv => ‘MY_MV’,result => res);
DBMS_OUTPUT.PUT_LINE(‘Fast Refresh Possible: ‘ || res);
END;
اگر نتیجه YES باشد یعنی میتوانید Fast Refresh انجام دهید.
اگر چند MV دارید که باید همزمان آپدیت شوند، از Refresh Groups استفاده کنید تا همه را با یک زمانبندی واحد بروزرسانی کنید.
برای این کار از پکیج DBMS_REFRESH استفاده میشود:
BEGIN
DBMS_REFRESH.MAKE(
name => ‘MY_GROUP’,
list => ‘MV1, MV2’,
next_date => SYSDATE,
interval => ‘SYSDATE + 1/24’);
END;
این کار هم مدیریت را ساده میکند و هم کارایی را بالا میبرد.
جمعبندی
پکیج DBMS_MVIEW مثل یک چاقوی سوئیسی برای DBAهاست!
باهاش میتونی MVها رو مدیریت کنی، بروزرسانیها رو سریعتر کنی، مشکلات رو قبل از وقوع پیدا کنی و دیتابیس رو بهینه نگه داری.
اگر درست استفاده شه، سرعت گزارشها و Queryهای تحلیلیات پرواز میکنه.
📥 اگر سوالی داری در مورد پکیج DBMS_MVIEW در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید