
اگر شما 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 در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید