2 Ekim 2009 Cuma

Materialized View

Eveet ilk bilgilendirme yazımıza materialized view larla başlayalım.


Nedir
??
Update edilebilen, tablolaşmış view'lardır diyebiliriz sanırsam.

Ha tablo, ha MV...

Basit anlamda MV'lar bir sorgunun tablolaşmış halidir diyebiliriz. E o zaman bu tablodur derseniz, ben de size "e tablodur" diye yanıt vermekte geri kalmam. Peki bu işin sırrı nerede? MV'lar siz refresh dediğiniz anda seçtiğiniz yönteme göre sorguyu yeniden çalıştırıp sizi bir sürü zahmetten kurtarır.

Ne Gibi?
  • Farklı lokasyondaki tablolardan topladığınız verileri tek komutla veya tanımlanmış bir iş sayesinde periyodik olarak özet tablonuzda toplayabilirsiniz.
  • MV'lar üzerine indeks tanımlayabileceğiniz için, sorgularınız çok çok hızlı çalışır. Bu indeksleri bir kere yaratırsın biter.
  • Üzerinde değişiklik yapılabilen MV'ler tanımlayabilirsiniz ama ben burada sadece Read-Only Mv'lardan bahsedicem.
  • Fast Refresh özelliği sayesinde sadece değişen kayıtlar güncellenir.

E ne zaman kullanıcaz?

  • Kayıt sayınız artıp, rapor sorgularınız çok geciktiğinde.
  • Birden fazla tablodan sorgu almak sizi zorladığında. (join olaylarını abarttığınızda)
  • Özet tablolarınızı periyodik olarak doldurmak istediğinizde.
  • En önemlisi (tabi bence yoksa Oracle illa böyle olacak demiyor.) Anlık olmayan raporlarınızda, yani 1 gün gecikmeli ya da ayda bir verdiğiniz raporlarda veya periyodik güncellenmesi gereken verilerde.
Asıl Sorun Nasıl Kullanıcaz?

Bunun için örnek verilerimizi hazırlayalım.


İki adet tablo oluşturulalım bunlardan birisi çalışanları diğeri de maaşları tutsun.
Yanlız ikinci tabloda maaşlar ay ay bulunsun.

(sorguları istediğiniz bir kullanıcı adı altında çalıştırabilirsiniz)


CREATE TABLE SCOTT.Personel
(
PersonelKimlikNo INTEGER,
PersonelAdi VARCHAR2(40),
PersonelSoyadi VARCHAR2(40)
);

CREATE TABLE SCOTT.MAAS
(
MAASID NUMBER,
PERSONELKIMLIKNO NUMBER,
MAAS NUMBER(10,2)
);

CREATE UNIQUE INDEX SCOTT.PK_MAASID ON SCOTT.MAAS
(MAASID);


ALTER TABLE SCOTT.MAAS ADD (
CONSTRAINT PK_MAASID
PRIMARY KEY
(MAASID);






İçlerine biraz da veri ekleyelim

SET DEFINE OFF;
Insert into SCOTT.PERSONEL
(PERSONELKIMLIKNO, PERSONELADI, PERSONELSOYADI)
Values
(1, 'Neşe', 'Oya');
Insert into SCOTT.PERSONEL
(PERSONELKIMLIKNO, PERSONELADI, PERSONELSOYADI)
Values
(2, 'Sevinç', 'Kaya');
COMMIT;



SET DEFINE OFF;
Insert into SCOTT.MAAS
(MAASID, PERSONELKIMLIKNO, MAAS)
Values
(1, 1, 50);
Insert into SCOTT.MAAS
(MAASID, PERSONELKIMLIKNO, MAAS)
Values
(2, 1, 70);
Insert into SCOTT.MAAS
(MAASID, PERSONELKIMLIKNO, MAAS)
Values
(3, 2, 50);
Insert into SCOTT.MAAS
(MAASID, PERSONELKIMLIKNO, MAAS)
Values
(4, 2, 60);
COMMIT;


Senaryo olarak da bu insanların çalışarak, hakederek :p bizden ne kadar (toplamda) maaş aldıklarını görmek isteyelim ve bunları da bir mv yaparak ayda bir güncelleyelim...


Şimdi sorgumuzun cevabı şu şekilde olacak


Personel Adı / Personel Soyadı / Bugüne kadar aldığı toplam maaş

sql de şu şekilde :

SELECT
M.PERSONELKIMLIKNO, sum(M.MAAS)
FROM SCOTT.MAAS M group by M.PERSONELKIMLIKNO;

Bu sql sayesinde personel bizden bu güne kadar toplam ne kadar maaş almış görebileceğiz.

Şimdi karar vermemiz gereken başka bir konu var. MV miz güncellenecek ama hangi yöntemle güncellenecek. Ben burada en sık kullanılan ya da bence kullanmamız gereken (basit mv ler için) Fast REFRESH metodu. Bu metodu kullanabilmek için, tablolarımızın loglanması gerekecek, böylece biz mv mizi yenileyeceğimiz zaman sadece değişen kayıtları güncelleyeceğiz.

Şimdi gelelim log tablo oluşturmaya

maaş tablosu için


CREATE MATERIALIZED VIEW LOG ON SCOTT.MAAS
NOCACHE
NOLOGGING
NOPARALLEL
WITH ROWID, SEQUENCE,
(MAASID,PERSONELKIMLIKNO,MAAS);

Log tablosu oluşturmak göründüğü gibi gayet kolay.


Artık Mv mizi create edip test edebiliriz.

İşte beklenen mv create sql'i.



CREATE MATERIALIZED VIEW SCOTT.PERMAAS
NOCACHE
NOLOGGING
NOCOMPRESS
NOPARALLEL
BUILD IMMEDIATE
USING INDEX
REFRESH FAST ON DEMAND
NEXT trunc(sysdate) + 1
AS
SELECT
M.PERSONELKIMLIKNO, sum(M.MAAS) TOPLAMMAAS
FROM SCOTT.MAAS M group by M.PERSONELKIMLIKNO;



NEXT trunc(sysdate) + 1 komutu sayesinde mv'miz hergün gece yarısında kendini yenileyecek.

Elle güncelleme için,


BEGIN
DBMS_SNAPSHOT.REFRESH(
LIST => 'SCOTT.PERMAAS'
,METHOD => 'F'
,PUSH_DEFERRED_RPC => TRUE
,REFRESH_AFTER_ERRORS => FALSE
,PURGE_OPTION => 1
,PARALLELISM => 0
,ATOMIC_REFRESH => TRUE
,NESTED => FALSE);
END;
/


kodunu kullanabilirsiniz.


Sorgulama Nasıl Olacak?

Herhangi bir tablodan sorgulamadan farksız. Üzerine index yaratıp sorgulamalarınızı hızlandırabilirsiniz. Örnek bir sorgulama sql'i de ekleyip bitirelim mv nasıl yaratılır konusunu.



SELECT
P.PERSONELKIMLIKNO, P.PERSONELADI, P.PERSONELSOYADI,M.TOPLAMMAAS
FROM SCOTT.PERSONEL P,SCOTT.PERMAAS M where m.PERSONELKIMLIKNO = P.PERSONELKIMLIKNO ;





Faydalı olması dileğiyle sevgiler, saygılar...

1 yorum: