Hurriyet

29 Ağustos 2013 Perşembe

Oracle Veritabanı: Materialized View ve Konsepti

Materialized View uzaktaki veya başka bir database'deki sorgunun sonuçlarını ana database'de tutan object'lerdir. Daha önce snapshot olarak tanımlanırlardı. Materialized View'lar belirli bir datanın o anki kopyasıdır.

Eğer materialized view başka bir database'deki object'e erişecekse, uzaktaki database'e bir link oluşturulması gerekmektedir.  Bunlar oluşturulmadan önce izinler kontrol edilir.

 GRANT CREATE DATABASE LINK TO scott;  
 GRANT CREATE MATERIALIZED VIEW TO scott; 

İzinler test edildikten sonra database link yaratılır.

CREATE DATABASE LINK orcl1  
 CONNECT TO berke IDENTIFIED BY berke  
 USING 'orcl'; 

Buradaki orcl ana makinamızın SID'sidir. "orcl1" ise link adıdır.

 CREATE MATERIALIZED VIEW employees  
  ON PREBUILT TABLE   
  REFRESH FORCE AS  
  SELECT *   
 FROM employees@orcl1 

Materialized View'lar Ne İşe Yarar?

Materialized View'lar ile değişiklikler takip edilir. Uzaktaki makinada ilgili tablolarda değişiklik yapılıp kaydedildiğinde o değişiklikler üzerine yaratılmış view ve tabloların bilgisi de değişmelidir. Materialized View'lar bir sorguya göre düzenlendiği için bu sorgulara göre view içindeki içerik değişmektedir.

Eğer herkesin aynı database'deki kayıtlara erişmesi gerekiyorsa ve network bağlantısının azaltılması gerekiyorsa başka database'lerde de materialized view'lar yaratılarak data'nın başka yerlerde kopyalanıp yedeklenmesi ve oralara ulaşılarak ana makina netwok trafiğinin azaltılması sağlanır.

Materialized View Log'ları Nedir ve Niye Yaratılır? 

Materialized View'ın üzerine ya da materialized view'ı oluşturan tablolara bir değişiklik yapıldığında(DML işlemleri yapıldığında), bu değişikliklerden etkilenen satırlarla ilgili bilgiler materialized view log'a kaydedilir. Bunu sağlayanda materialized view log'la oluşturulan bir "after row"  trigger'ıdır.

Materialized view log'unu eğer master tablo üzerine yaptığımız değişikliklerin hemen materialized view'lar üzerinde güncellenmesini istiyorsak yaratmalıyız. Materialized view log'u yaratıldığında adı "MLOG$_tablo_adı" olarak belirlenir.

Materialized View'lar Nasıl Bulunur?


 select * from dba_base_table_mviews;  

Materialized View Log Nasıl Yaratılır?


SQL> create materialized view log on emp with rowid;  

Invalid Olan Materialized View'ların Bulunması:


select * from dba_objects where status='INVALID' and object_type like 'MATE%';

Invalid olan materialized view'ları dba_objects'ten bulabileceğimiz gibi dba_mviews adlı tablodan da bulabiliriz.

 select * from dba_mviews;  

Invalid Olan Materialized View'ların Compile Edilmesi:

İlk olarak compile edilecek Materialized View'lar için bir ifade yaratırız. Bunu aşağıdaki ifade ile yaratabiliriz.

select 'alter materialized view '|| object_name ||' compile;' from dba_objects where status='INVALID' and object_type like 'MATE%';

Bu sorgu sonucunda çıkan sonuçlarıda kopyalayıp çalıştırabiliriz.

Materialized View'lar Niye Invalid Olur?

Materialized view'lar içlerindeki data'lar değiştiğinde invalid hale düşerler. Bu yüzden eğer içlerindeki datalar değişirse compile edilmeleri gerekir.

SQL> create materialized view log on emp with rowid;  
   
 Materialized view log created.  
   
 SQL>  
 SQL> create materialized view emp_mv  
  2 refresh fast on demand  
  3 with rowid  
  4 as select * from emp;  
   
 Materialized view created.  
   
 SQL>  
 SQL> select status,object_type  
  2 from user_objects  
  3 where object_name = 'EMP_MV' and object_type='MATERIALIZED VIEW';  
   
 STATUS OBJECT_TYPE  
 ------- -------------------  
 VALID  MATERIALIZED VIEW  
   
 SQL>  
 SQL> select mview_name,compile_state  
  2 from user_mviews;  
   
 MVIEW_NAME           COMPILE_STATE  
 ------------------------------ -------------------  
 EMP_MV             VALID  
   
 SQL>  
 SQL>  
 SQL> update emp set ename=ename where empno>7500;  
   
 12 rows updated.  
   
 SQL> commit;  
   
 Commit complete.  
   
 SQL>  
 SQL> select status,object_type  
  2 from user_objects  
  3 where object_name = 'EMP_MV' and object_type='MATERIALIZED VIEW';  
   
 STATUS OBJECT_TYPE  
 ------- -------------------  
 INVALID MATERIALIZED VIEW  
   
 SQL>  
 SQL> select mview_name,compile_state  
  2 from user_mviews;  
   
 MVIEW_NAME           COMPILE_STATE  
 ------------------------------ -------------------  
 EMP_MV             NEEDS_COMPILE 

Materialized View'ları Compile Edecek Script:

Aşağıdaki script'imizde compile edilebilinecek bütün materialized view'lar compile edilir.  Sonrasında hata alan olursa hata alanlar belirtilir.

 declare  
 z varchar2(100);  
 cursor a is select owner,object_name from dba_objects where status='INVALID' and object_type like 'MATE%';  
 begin  
 for x in a   
 loop  
 z := 'alter materialized view ' || x.owner || '.'|| x.object_name || ' compile' ;  
 dbms_output.put_line(z);  
 begin  
 execute immediate z;  
 exception   
  when others  
  then  
  dbms_output.put_line('HATALI:');dbms_output.put_line(z);
 end;  
 end loop;  
 end;  
 /  




X$DBAGALERTEXT Tablosu:

Bu tablo sistemdeki alert.log'un veritabanınındaki tanımlı halidir. Önceden bu tablo otomatik olarak gelmediği için dba'ler external tablo olarak alert.log'u veritabanına kaydedip onun üzerinde sorgu çekerlerdi. 11g versiyonundan sonra bu tablo veritabanına x$dbagalertext olarak tanımlanmıştır. Böylece external tablo olarak belirtmeden de sorgu çekebilir hale gelmiş olduk ancak SYS kullanıcısı dışında kimse bu tabloya sorgu atamadığı için hala bir sorun bulunmaktadır. Bu sorunu çözmek için bir yöntem ise bu tablonun view'ının veya materialized view'ının oluşturulması gerekir. Bu da materialized view için uygun bir örnek olabilir.


Referanslar:

https://community.oracle.com/thread/2356037?tstart=0
http://docs.oracle.com/cd/A97630_01/server.920/a96567/repmview.htm



Hiç yorum yok:

Yorum Gönder