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

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

آموزش کامل پکیج DBMS_MVIEW در Oracle

اگر با پایگاه داده اوراکل کار کرده باشی، حتماً اسم 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

  1. ایجاد Materialized View Log:
				
					CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE (amount_sold, ...)
INCLUDING NEW VALUES;

				
			
  1. ساخت 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 در اوراکل داری، در بخش کامنت‌ها بپرس.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

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

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

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