بروزرسانی Out of Place – ویژگی جدید MATERIALIZED VIEW در اوراکل 12c

تا قبل از اوراکل نسخه 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

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

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

نشانی ایمیل شما منتشر نخواهد شد.