Sorgularda Indexed View kullanımı
Bir view üzerinde unique clustered index tanımlandıysa buna indexed view denir. Indexed view ‘de sorgu sonucu unique clustered index üzerinde tutulur. Bu yüzden indexed view, diğer view’ler gibi sanal tablo değildir. Normal tablolar gibi, fiziksel olarak, veritabanında, sorgu sonucu tutulur.
Indexed view hakkında bilinmesi gerekenler:
- Indexed view’ler aggregate function ve ya join içeren ifadelerde performans artışı sağlar. Çünkü hesap ve join işlemleri sonucu indexed view içinde tutulur.
- Indexed view’i aggregate function veya join içermeyenen ifadelerde kullanmak gözle görülür performans artışı sağlamaz.
- Indexed view’in içerdiği tablolar, her güncellendiğinde , indexed view de güncellenir. Nasıl ki bir tablo güncellendiğinde ,tabloya ait index’ler güncelleniyor. Aynen onlar gibi indexed view de güncelleniyor. Bu da sql server’a ek yük getiriyor. Cpu yükseltiyor. Bu yüzden indexed view çok transaction alan tablolara önerilmez, genelde raporlama amaçlı tablolara önerilir.
Performans artışına dair açıklamaya bakılabilir.
http://www.sqlteam.com/article/indexed-views-in-sql-server-2000
Indexed view oluşturma şartları:
- Indexed view'de AVG() fonksiyonu kullanılamaz.
- TOP, EXISTS,NOT EXISTS, OUTER JOIN, COUNT(*), MIN, MAX, “Subqueries”, “table hints”, TOP, UNION kullanılamaz.
- Hesaplanan kolonlar nullable olamaz. Not null olmalı.
- GROUP BY kullanıyorsanız, Count_Big(*) ifadesi select'e dahil olmalı.
- Indexed view sadece SCHEMABINDING deyimi kullanılarak tanımlanabilir.
- Indexed view oluşturacağınız session aşağıdaki şartları sağlamalı
- SET ANSI_NULLS ON
- SET ANSI_PADDING ON
- SET ANSI_WARNINGS ON
- SET CONCAT_NULL_YIELDS_NULL ON
- SET NUMERIC_ROUNDABORT OFF
- SET QUOTED_IDENTIFIER ON
- SET ARITHABORT ON
Indexed view aggregate function örneği:
1. Önce SCHEMABINDING kullanılarak normal view oluşturulur.
create VIEW maas_aggr WITH SCHEMABINDING AS
SELECT meslek, sum(maas) toplam_maas,COUNT_BIG(*) AS sayisi
FROM [dbo].[Table_1]
group by meslek
2. Normal view üzerine unique clustered index tanımlanır.
create unique clustered index maas_aggr_ind on maas_aggr (meslek)
3. A) Sql server 2005 developer ve enterprise versiyonu ile Sql server 2008 ve üstündeki versiyonlarda aşağıdaki sorgularda query optimizer, indexed view’i tanır ve kullanır.
SELECT meslek, sum(maas) toplam_maas,COUNT_BIG(*) AS sayisi
FROM [dbo].[Table_1]
group by meslek
select * from maas_aggr
- Ayrıyeten yukarıdaki sorgular dışındaki sorgularda da , query optimizer gerekli görürse indexed view’i , kullanabilir.
B) Sql server 2005 standart ve alt versiyonlarında kullanım şekli
select * from maas_aggr WITH (NOEXPAND)
Not : WITH (NOEXPAND) deyimini kullanmazsanız , query optimizer, bu view’i normal view olarak algılar. Indexed view olarak görmez.
Indexed view join örneği;
1.Önce SCHEMABINDING kullanılarak normal view oluşturulur.
create VIEW maas_aggr2 WITH SCHEMABINDING AS
select a.Id a_id,b.Id b_id,a.isim,a.soyisim,a.maas,b.adres from dbo.Table_2 a,dbo.Table_4 b where a.isim=b.isim and (a.Id%300 between 5 and 20) and (a.maas between 7000 and 8000) and b.adres like '%e as%' and b.adres like '%ha%'
2. Normal view üzerine unique clustered index tanımlanır.
create unique clustered index maas_aggr_ind2 on maas_aggr2 (a_id,b_id)
Not: Index, unique tanımlanması gerektiğinden yukarıda 2 tabloya ait Id’ler birleştirilerek clustered index tanımlanmıştır.
Çok elzem ise ve indexed view tanımlanacak tablonun kendisine ait index sayısı fazla değil ise özel sorgulara yönelik indexed view tanımlanabilir.
Yorumlar (0)