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ı
  1. SET ANSI_NULLS ON
  2. SET ANSI_PADDING ON
  3. SET ANSI_WARNINGS ON
  4. SET CONCAT_NULL_YIELDS_NULL ON
  5. SET NUMERIC_ROUNDABORT OFF
  6. SET QUOTED_IDENTIFIER ON
  7. 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.

Share This Article

Comments (0)

Leave a Comment