تا قبل از اوراکل نسخه 12c، معمولا بروزرسانی به طور مستقیم در جدول مربوط به MV اتفاق می افتاد(ابتدا اطلاعات حذف شده و سپس در همان session، اطلاعات جدید درج می شوند و نهایتا commit رخ خواهد داد) به بیانی دیگر، در این نسخه ها، بروزرسانی تنها به صورت in place (در جا) اتفاق می افتد که مرحله delete آن ممکن است متناسب با حجم جدول، زمان زیادی را صرف کند.
در نسخه 12c این امکان بوجود امد تا بدون هرگونه تغییر جدول اصلی مربوط به MATERIALIZED VIEW، بروزرسانی انجام شود که این شکل از بروزرسانی، Out of Place نام دارد.
شیوه بروزرسانی Out of Place به این شکل است که ابتدا جدولی به صورت موقت ایجاد شده که شامل اطلاعات بروز شده می باشد و این جدول با جدول جاری mv جایگزین خواهد شد البته بروزرسانی باید به صورت non-atomic انجام پذیرد.
exec DBMS_MVIEW.REFRESH(‘MV1’, method => ‘FAST’, atomic_refresh => TRUE, out_of_place => TRUE);
ORA-20000: ORA-32355: out-place refresh cannot be used in atomic mode
این روش محدودیتهایی هم دارد که بزرگترین آن، عدم پشتیبانی complete refresh به صورت از راه دور می باشد. به طور مثال:
CREATE MATERIALIZED VIEW MV1 REFRESH fast ON DEMAND AS select * from ag1@am_test;
exec DBMS_MVIEW.REFRESH(‘MV1’, method => ‘COMPELETE’, atomic_refresh => FALSE, out_of_place => TRUE);
ORA-32354: cannot refresh materialized view USEF.MV1 using out-of-place complete refresh
ORA-06512: at “SYS.DBMS_SNAPSHOT”, line 2821
ORA-06512: at “SYS.DBMS_SNAPSHOT”, line 3058
ORA-06512: at “SYS.DBMS_SNAPSHOT”, line 3017
ORA-06512: at line 2
از محدودیتهای دیگر این روش، می توان به عدم پشتیبانی از ON COMMIT refresh، نوع داده LOB و همچنین mvهایی که روی آنها materialized view log، triggersو یا constraint تعریف شده اند، نام برد.
بروزرسانی به شیوه out of place در شیوهای مختلف بروز رسانی اعم از comlete، force و fast قابل انجام می باشد.
شیوه انجام این مدل از بروزرسانی به صورت زیر می باشد:
exec DBMS_MVIEW.REFRESH(‘MV1’, method => ‘COMPLETE’, atomic_refresh => FALSE, out_of_place => TRUE);
پرس و جوی زیر در هنگام اجرای بروزرسانی اجرا شده است و نشان می دهد که جدولی موقت با اسم RV$18E8A، برای این کار ایجاد شده است:
select owner,segment_name,segment_type,bytes from dba_segments l where segment_name like ‘%RV%’;
USEF RV$18E8A TABLE 22020096