16 Temmuz 2008 Çarşamba

Materialized View

Oracle DW uygulamalarında sıkça rastlayabileceğimiz bir yapı olan Materialized Viewları, saklı tablo sonuçları olarak düşünebiliriz. Normal Viewlardan farkı, bir sql sorgusu olarak değil de sql sorgusu + data olarak saklanmasıdır. Yani MV diskte yer kaplar.

Peki neler yapılıyor MVlerle, milyonlarca kayıt bulunan tabloda belli sorguları önceden çalıştırıp bunun sonuçlarını saklama işlemini yapıyoruz.
Örneğin, bir satış tablomuz var, 5 milyar kaydımız var bu tabloda, 100 id'li müşterinin o günkü toplam harcamalarını öğrenmek istiyoruz. Bu öğrenme işi çok fazla kez tekrar ediliyor diyelim. 5 milyar kayıt içinde group by, sum() gibi sql özelliklerini kullanmak çok fazla kaynak kullanımına sebebiyet vereceğinden dolayı, bu işlemlerin önceden bir yerde tutulması bizim işimize yarayacaktır.

Yazının başında belirtildiği gibi, Data Warehouse sistemlerde özellikle kullanılan bir yapı, biraz real-time uygulamaların dışında gerçekleştirilebilir diyebiliriz. Örneğin salı günkü verilerden yola çıkarak, çarşamba günü rapor hazırlama işlemleri bu şekilde daha hızlı gerçekleştirilebilir. Salı akşamı sorgular çalıştırılır, MV'ler güncellenir, çarşamba günü sorgular çalıştırıldığında Ana tablo yerine bu MV'lerden ilgili bilgiler çekilmiş olur. Yani 5 milyar kayıt içinde arayacağımıza, çok daha az miktarda veri içinde arama yapmış olacağız. Bu da bizim kaynakları kullanma performansımızı arttıracak. Fakat bu durumda güncel verilerden yararlanmamış oluyoruz, sadece önceki güne ait verilerden yararlanmış oluyoruz. Bunu önleme yöntemleri de mevcut, MV'de.

MV'de bilinmesi gereken en önemli özelliklerden birisi de Query Rewriting özelliği. Bu özellik Session bazında ve MV oluştururken enable yapıldığı takdirde, MV 'in sql sorgusu çalıştırıldığında ana tablo yerine MV'den veriler çekilmiş oluyor. Şöyle ki, MV yi oluştururken "SELECT * FROM SALES" olarak oluşturduğumuz zaman, Query Rewriting özelliği enable olur ise, "SELECT * FROM SALES" sorgusu çalıştırıldığında, CBO ( Cost Based Optimizer ) bu sorgunun aslında MV'den çekilmesine karar verir ve yazılan sorguyu MV'yi işaret edecek şekilde ( örn : "SELECT * FROM MV_SALES" ) değiştirirr ve sorguyu yapan farkında olmadan MV kullanılmış olur.

Eğer bu özellik enable edilmez ise, MV'den yararlanmak için sorgu yazılırken MV direk işaret edilmelidir. "SELECT * FROM MV_SALE" gibi, aksi takdirde direk ana tablodan veriler çekilir.

Hiç yorum yok:

Yorum Gönder