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

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

استفاده از Materialized Views در Oracle برای بهینه‌سازی گزارش‌های سنگین

اگر شما DBA، برنامه‌نویس، یا حتی مدیر IT باشید، احتمالاً تجربه کردید که بعضی گزارش‌های سنگین می‌توانند کل سیستم پایگاه داده را به زانو دربیاورند.

چند جدول بزرگ، چند JOIN پیچیده، و کمی GROUP BY کافیست تا CPU شما از خستگی ناله کند.

اینجاست که Materialized View در اوراکل وارد بازی می‌شود و با ذخیره نتایج Query مثل یک نسخه آماده و فوری، نفس تازه‌ای به سیستم شما می‌دهد.

در این مقاله آموزش Oracle در بخش آموزش Oracle SQL میخواهیم در مورد Materialized View کمی صحبت داشته باشیم. 

در دیتابیس اوراکل، پایداری داده‌ها و امکان بازیابی پس از هر حادثه یکی از ستون‌های اصلی معماری است. پیشنهاد می شود نوشته زیر را مطالعه کنید:

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

Materialized View چیست؟

در یک جمله: یک جدول از پیش ساخته‌شده که نتیجه یک Query را نگه می‌دارد.

برخلاف View معمولی که هر بار Query را اجرا می‌کند، MV داده‌ها را به‌صورت فیزیکی ذخیره می‌کند و فقط هر از گاهی به‌روزرسانی می‌شود.

📌 مثال:

				
					-- query
SELECT cust_id, SUM(s.amount_sold) AS total_sales
FROM sales s
GROUP BY s.cust_id

-- create MATERIALIZED VIEW base
CREATE MATERIALIZED VIEW LOG ON sales
  WITH ROWID, SEQUENCE (cust_id, amount_sold)
  INCLUDING NEW VALUES;
  
-- create MATERIALIZED VIEW   
CREATE MATERIALIZED VIEW mv_sales_summary
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS
SELECT c.cust_country, SUM(s.amount_sold) AS total_sales
FROM C##ZAM.sales s
JOIN customers c ON s.cust_id = c.cust_id
GROUP BY c.cust_country;
-------------------------------------------
-- select mv 
SELECT * FROM mv_sales_summary;
				
			

این MV همیشه جمع فروش هر منطقه را نگهداری می‌کند، آن هم با به‌روزرسانی سریع در لحظه COMMIT.

فرق View معمولی با Materialized View

ویژگی View عادی Materialized View
ذخیره فیزیکی داده ❌ ندارد ✅ دارد
سرعت اجرای Query سنگین پایین بالا
نیاز به فضای دیسک ❌ ندارد ✅ دارد
قابلیت Refresh

انواع Refresh در MV

۱. Fast Refresh

فقط تغییرات جدید را به MV اضافه می‌کند.

شرطش داشتن Materialized View Log است:

				
					CREATE MATERIALIZED VIEW LOG ON sales
  WITH ROWID, SEQUENCE (cust_id, amount_sold)
  INCLUDING NEW VALUES;
				
			

۲. Complete Refresh

کل داده دوباره‌سازی می‌شود:

				
					BEGIN
  DBMS_MVIEW.REFRESH('MV_SALES_SUMMARY', 'C');
END;

				
			

۳. On Commit و On Demand

  • ON COMMIT: به‌روزرسانی فوری بعد از هر Commit (برای دیتای کم خوب است)
  • ON DEMAND: دستی یا زمان‌بندی‌شده با Scheduler (برای حجم بالا مناسب‌تر است)

نکات طراحی MV برای گزارش‌های سنگین

  • فقط ستون‌های لازم را انتخاب کنید.
  • روی ستون‌های پرکاربرد ایندکس بگذارید:
				
					CREATE INDEX idx_mv_sales_summary_region
ON mv_sales_summary(region_id);

				
			
  • برای دیتای بزرگ از Partitioning استفاده کنید.
  • زمان Refresh را هوشمندانه تعیین کنید (مثلاً شب‌ها برای گزارش روزانه).

مثال واقعی: فروشگاه آنلاین با دیتای میلیاردی

فرض کنید یک فروشگاه روزانه ۵ میلیون رکورد فروش دارد و مدیر هر صبح گزارش فروش روز گذشته را می‌خواهد.

راه‌حل:

				
					CREATE MATERIALIZED VIEW mv_daily_sales
BUILD IMMEDIATE
REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE+1)
AS
SELECT trunc(sales_date) AS sale_day,
       SUM(sales_amount) AS total_sales
FROM sales
GROUP BY trunc(sales_date);

				
			

حالا گزارش صبحگاهی تنها با یک SELECT سریع آماده می‌شود.

مشکلات رایج و راهکار با Materialized View

مشکل دلیل راهکار
کندی Refresh حجم زیاد داده استفاده از Fast Refresh و ایندکس
قفل شدن جدول استفاده از On Commit در حجم بالا تغییر به On Demand
ORA-12004 نداشتن MV Log ساخت MV Log برای جدول موردنظر

کاربردهای Materialized View در صنعت

  • بانک‌ها: خلاصه‌سازی تراکنش‌ها، محاسبه سود روزانه
  • تحلیل داده و BI: تهیه Fact Table خلاصه‌شده برای ابزارهایی مثل Power BI یا Tableau
  • فروشگاه‌های آنلاین: گزارش سریع فروش و موجودی

مزایا و معایب Materialized View

مزایا معایب
افزایش چشمگیر سرعت گزارش نیاز به فضای دیسک اضافی
کاهش بار روی جداول اصلی نیاز به مدیریت Refresh
امکان زمان‌بندی خودکار احتمال وجود داده قدیمی (Delay)

سوالات متداول درباره Materialized View در اوراکل

Materialized View یک شیء دیتابیس است که خروجی یک Query را به‌صورت فیزیکی ذخیره می‌کند و دوره‌ای به‌روز می‌شود، در حالی که View معمولی هر بار اجرا می‌شود و داده ذخیره‌شده ندارد.

MV به‌خصوص در گزارش‌های سنگین باعث افزایش سرعت می‌شود.

اگر حجم داده تغییرات کمی دارد و MV Log ساخته شده، از Fast Refresh استفاده کنید تا سریع و کم‌هزینه باشد.

اگر تغییرات زیاد است یا MV Log ندارید، Complete Refresh ایمن‌تر است ولی زمان بیشتری می‌گیرد.

نه همیشه! MV فقط وقتی مفید است که Query شما سنگین باشد و نتایج آن زیاد تغییر نکند.

در Query‌های کوچک یا دیتا با تغییر سریع، هزینه نگهداری و Refresh می‌تواند بیشتر از سود عملکرد باشد.

با استفاده از پارتیشن‌بندی MV، ایندکس‌گذاری ستون‌های کلیدی، انتخاب استراتژی صحیح Refresh (Fast یا Complete)، و زمان‌بندی اجرای Refresh در ساعات کم‌بار می‌توانید سرعت را بالا ببرید.

جمع‌بندی

اگر گزارش‌هایتان سیستم را کند می‌کند، Materialized View همان دوست قدیمی است که بی‌صدا و سریع، داده‌ها را آماده و تحویل می‌دهد.

با انتخاب استراتژی Refresh درست، ایندکس‌گذاری هوشمندانه، و طراحی بهینه، گزارش‌های سنگین شما مثل نسیم اجرا خواهند شد، نه طوفان.

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

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

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

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

میثم راد

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

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

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