View ve Materialized View Nedir ? Kullanım Amaçları Nelerdir ?

Burak Bakar
Bentego Teknoloji
Published in
7 min readSep 12, 2023

Selamlar, bu yazımda sizlere SQL’de sıkça kullanılan View ve Materialized View yapısından bahsedeceğim.

View

View Nedir ?

İlk başta netleştirilmesi gereken bir nokta olan, View’lar birer tablo değillerdir. Adından da anlaşılacağı üzere çeşitli sorgular sonucu ortaya çıkan ve tıpkı normal tablolarda yaptığımız gibi Select ifadesi ile erişebildiğimiz gerçekte var olmayan sanal tablolardır. Bu oluşturulan sanal tabloların beslendiği base tablo sistemlerine ve bu sanal tabloları kullanan kullanıcılara hayli fazla yararı vardır.

View Kullanmanın Faydaları Nelerdir ?

• Güvenlik : Bir view kullanmanın en önemli faydalarından biri güvenliktir. Ana tabloda bulunan tüm bilgileri dışarıya açmak istemeyebiliriz. Oluşturulacak bir Vew sayesinde Base tabloda bulunan ve herkesin erişmesini istemediğiniz kolonları dışarıda bırakabiliriz ve yalnızca paylaşmak istediğimiz kolonların bu View’da görünmesini sağlarız. Bu sayede de veriye erişimi kısıtlayabiliriz.

• Performans : Farklı tablolardan ihtiyacımız olan kolonları çeşitli join yapılarıyla birleştirmek ve bu yapıları tekrar tekrar kullanmak uzun ve zahmetli bir işlem olabilir. Oluşturulacak bir View tek bir defa yazdığımız sorguyu oluşturduğumuz sanal tablolar üzerinden defalarca kullanabiliriz. Aynı zamanda bu işlem sorgu sürelerini de kısaltıp hata payını da en aza indirerek zamandan tasarruf etmemizi sağlayacaktır. Ayrıca veritabanı View ile oluşturulan veriyi saklamaz herhangi bir boyutu yoktur. View sorgusu her çalıştığında sanal tablo yeniden oluşturulur.

View İşlemleri Nasıl Yapılır ?

• Create View : Yeni bir View oluşturmak için kullanılır.

• Alter View : Daha önceden oluşturulmuş bir View üzerinde değişiklik yapılmak için kullanılır.

• With Encryption : Oluşturulan View’ın şifrelenmesi için kullanılır. Geri dönüşü yoktur.

• Drop View : Oluşturulmuş bir View’ı veritabanından silmek için kullanılır.

1-) View Oluşturma

Basit şekilde bir View oluşturmak için Create ifadesi kullanmamız gerekir.

CREATE VIEW viewAdi
AS
SELECT sutunAdi FROM tabloAdi;

Parametreli bir View oluşturmak istersek ;

CREATE [OR REPLACE] [FORCE | NOFORCE ] VIEW viewAdi (kolonAdi ,…)
AS
SELECT sutunAdi FROM tabloAdi
[WITH CHECK OPTION ]
[WITH READ ONLY];

Buradaki parametleri anlamlandıracak olursak ;

• Create View : Yeni bir View oluşturmak için

• Create or Replace View : Yeni bir View oluşturmak veya var olan bir View üzerinden güncelleme yapmak için.

• Noforce : Bir View varsayılan olarak Noforce olarak oluşturulur. Bu durumda bir View oluşturulma aşamasında belirtilen tüm tabloların var olması gerekir aksi halde View oluşturulmaz.

• Force : Noforce durumun tam tersi olarak oluşturmaya çalıştığımız View’da belirttiğimiz kolonlar Base tabloda bulunmasa da bu View oluşturulur. Genel olarak yeni bir veritabanı oluşturulurken tercih edilir.

• With Check Option : Oluşturduğumuz bir View, where koşulu içeriyorsa; bu View üzerinde yapılan herhangi bir DML işleminin kontrollü şekilde yapılmasını ve şarta uymayan durumun asıl tabloyu etkilemesinin önüne geçer.

• With Read Only : Oluşturulan bir View’da herhangi bir DML işleminin yapılmasını engeller.

NOT : View üzerinde yapılan değişiklikler, kendilerini oluşturan Base tabloları da etkiler ve bu durumda tüm değişiklikler Base tablolarda da geçerlidir. Çeşitli kısıtlamalarda yeni kayıt eklenebilir, silinebilir veya güncelleme yapılabilir dolayısıyla DML işlemleri kontrollü bir şekilde yapılmalıdır.

2-) View Güncelleme

Bir View’da değişiklik yapmak için Alter ifadesi kullanılır.

ALTER VIEW viewAdi AS
SELECT sutunAdi FROM tabloAdi;

3-) View Şifreleme

Oluşturulan View’ın kaynak kodlarını şifreleyebiliriz. Bu durumda kimse View’ı oluşturan kaynak kodlara ulaşamaz. Ancak gözden kaçmaması gereken bir nokta da, şifrele işlemi sonrası biz de bu kaynak kodlara ulaşamayacağımız için daha sonra oluşabilecek gereksinimlerden ötürü bu işlem öncesi bir kopya kaydetmek faydalı olacaktır.

Şifreleme işlemi ENCRYPTION ifadesi ile gerçekleştirilir. Bu işlem bir View oluşturulurken yapılabileceği gibi daha sonradan da şifreleme yapılabilir.

CREATE VIEW viewAdi
WITH ENCRYPTION AS
SELECT sutunAdi FROM tabloAdi;

4-) View Silme

Silmek istediğimiz bir View için tablo işlemlerinden de aşina olduğumuz DROP ifadesi kullanılır.

DROP VIEW viewAdi;

Materialized View

Materialized View Nedir ?

View’lar, oluşturulan çeşitli sorgular sonucu bize sanal bir görüntü verirken; Materialized View’larda bu durum biraz daha farklı işler. Materialized View’lar bu sorgular sonucu dönen veriyi aynı zamanda veritabanında saklar. Yani tam olarak bir tablo görevi görür. Bu durum View’ların aksine Materialized View sonucu oluşan tablonun bir boyutu olmasını ve hafızada yer kaplamasını da beraberinde getirir.

Materialized View Kullanmanın Faydaları Nelerdir ?

Bir Materialized View oluşturduktan sonra ortaya çıkan tablo bize hazır bir veriyi sunar. Bu durumda da çok büyük veriler barındıran tablolarda istenilen kriterlere uygun bir Materialized View oluşturulduğunda, istediğimiz veri hali hazırda var olacağından dolayı hızlı bir şekilde erişilebilir olacaktır.

Materialized View oluşturulduktan sonra tabloya insert süresi normalden uzun sürer ancak Select sorgularımız çok daha kısa sürede dönecektir.

Oluşturacağımız özet tabloların periyodik olarak güncellenmesini istediğimiz durumlarda Materialized View yapısı, oluşan tabloyu periyodik olarak güncelleme yeteneği sağlar.

Materialized View Kullanırken Dikkat Edilmesi Gereken Durumlar Nelerdir ?

Materialized View aynı zamanda mevcutta var olan bir verinin kopyasını farklı bir tabloda oluşturma durumudur. Oluşan yeni tablo veritabanında bir yer kaplar. Bu nedenle Materialized View yapısı kullanılırken tablo boyutu konusunu da göz önünde bulundurmak gerekir.

Materialized View en son ne zaman çalıştırıldıysa o zamana ait veriyi tutar. Dolayısıyla güncel veri ile çalışmak istendiğinde bu Materialized View’ı Refresh etmek gerekir. Materialized View’ı Refresh etme işlemlerini aşağılarda ele alacağız.

Materialized View İşlemleri Nasıl Yapılır ?

1-) Materialized View Oluşturma

CREATE MATERIALIZED VIEW mviewName
BUILD [IMMEDIATE | DEFERRED]
REFRESH [FAST | COMPLETE | FORCE ]
ON [COMMIT | DEMAND ]
[[ENABLE | DISABLE] QUERY REWRITE]
AS
SELECT sutunAdi FROM tabloAdi;

Bir Materialized View oluşturma aşamasında kullanılan parametreleri anlamlandıracak olursak ;

• Create Materialized View : Yeni bir Materialized View oluşturmak için.

• Build Immediate : Materialized View oluşturulduğu anda istenilen veriyi tabloya anıda yazar.

• Build Deferred : Materialized View oluşturulduğu anda değil de ilk Refresh yapıldığı anda tabloya istenilen verileri yazar.

• Refresh Fast : Kullanılan tablolarda en ufak bir veri değişikliği olduğu anda algılanır ve o satırlar refresh edilir. Fast Refresh yapmak için öncelikli olarak Materialized View Logu oluşturmak gerekir. Çünkü MV Log üzerinden çalışır. MV Log konusuna aşağıda değineceğiz.

• Refresh Complete : Kullanılan kaynak tablolarda herhangi bir değişiklik olursa, Materialized View tabloyu yeniden güncel şekilde oluşturur. Bu işlem yapılırken Materialized View ile hali hazırda oluşan tablo önce Truncate edilir sonra Insert işlemi yapılır.

• Refresh Force : Hibrit bir parametredir. Fast Refresh mümkün ise fast yapar eğer mümkün değil ise Complete Refresh ile tabloyu doldurur.

• On Commit : Materialized View’ı oluşturan kaynak tablolarda herhangi bir değişiklik commit edildiği anda Materialized View tekrardan çalıştırılır.

• On Demand : Manuel veya Schedule şekilde refresh işlemi yapılmak istendiğinde Demand parametresi kullanılmalıdır. Genellikle manuel şekilde refresh işlemi gerçekleştirmek için DBMS_MVIEW.refresh(‘MV_NAME’) komutu kullanılır.

• Query Rewrite Enable — Disable : Query Rewrite işlemini aktif-pasif etmeye yarar. Query Rewrite işlemine aşağıda değineceğiz.

Ayrıca bir Materialized View’ı silmek istersek Drop ifadesi kullanılır.

DROP MATERIALIZED VIEW mviewName;

2-) Materialized View Log Oluşturma

CREATE MATERIALIZED VIEW LOG ON tabloAdi;
DROP MATERIALIZED VIEW LOG ON tabloAdi;

Materialized View oluşturulma aşamasında Refresh türü olarak Fast Refresh kullanılmak isteniyorsa MV Log oluşturulması gerekmektedir. Materialized View’ı oluşturan tablolarda herhangi bir DML işlemi yapıldığında bu değişikliği kontrol eder ve oluşturulan Log içerisine kayıt eder. Bu kayıtlar sonucunda da Refresh esnasında yalnızca bu değişen kayıtları tablomuza uygular.

Fast Refresh sırasında On Commit ifadesinin olup olmaması durumunda MV Log dosyalarında bir takım farklılıklar olur.

- Otomatik refresh olan Materialized View’ların MV Log dosyalarında commit edilmemiş değişiklikler de yer alır.

- Manuel refresh edilmiş bir Materialized View’ın MV Log dosyasında ise commit edilmemiş verilerin yanında aynı zamanda Refresh edilmemiş veriler de gözükmektedir.

3-) Refresh Materialized View

Materialized View yapısı kurulurken Refresh süreçlerinde On Commit ifadesi kullanılmışsa Materialized View’da herhangi bir değişiklik olmadığı sürece otomatik olarak refresh işlemi gerçekleştirilir.

Aşağıdaki gibi refresh işlemini yapabilen bir schedular, bizim belirleyeceğimiz zaman aralıklarında çalışabileceği gibi, manuel olarak da tetiklenebilir.

Schedule şekilde çalıştırmak için;

BEGIN
DBMS_REFRESH.make(
name => ' MV_NAME'',
list => '',
next_date => SYSDATE,
interval => '/*1:Mins*/ SYSDATE + 1/(60*24)',
implicit_destroy => FALSE,
lax => FALSE,
job => 0,
rollback_seg => NULL,
push_deferred_rpc => TRUE,
refresh_after_errors => TRUE,
purge_option => NULL,
parallelism => NULL,
heap_size => NULL);
END;
/
BEGIN
DBMS_REFRESH.add(
name => ' MV_NAME'',
list =>'',
lax => TRUE);
END;
/

Manuel çalıştırmak için ise ;

DBMS_MVIEW.refresh('MV_NAME')

4-) Query Rewrite Nedir ?

Query rewrite ifadesi Enable ve Disable olmak üzere iki parametre almaktadır. Enable yapılması durumunda Materialized View’ın içerisinde kullanılan sorguyu çalıştıran bir kullanıcı, Materialized View’ın ismini bilmese bile sorgusu hazır oluşturulan veriden getirilir. Bu sayede sorgu daha hızlı çalışır. Enable kullanıldığı halde çalıştırılan SQL sorgusunda bu özellik kullanılmak istenmez ise sorguya /*+no_rewrite*/ ifadesi eklenmelidir.

Eğer bu özellik Enable edilmez ise, Materialized View kullanılmak isteniyorsa Materialized View işaret edilmelidir. Diğer durumda veriler kaynak tablolardan çekilir.

Materialized View oluşturulma aşamasının yanında aynı zamanda session bazında da Query Rewrite üzerinden Alter ifadesi ile değişiklik yapılabilir.

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;

Umarım paylaştığım bilgiler faydalı olmuştur, okuduğunuz için teşekkürler.

--

--