PostgreSQL MultiColumn İndex

PostgreSQL MultiColumn İndex, Bu yazımda index tanımlarken bir veya birden fazla kolona index atmayı ve birden fazla kolonlara neden index atılacağından bahsedeceğim. Önceki yazılarımda index nedir nasıl kullanılır unique index kavramlardan bahsettim .

İlk olarak aşağıdaki gibi tablomuzu oluşturalım.

create table indextabled1(kolon1 integer, kolon2 text, kolon3 boolean);

Tablomuzu oluşturduktan sonra aşağıdaki gibi random verilerimizi yükleyelim.

insert into indextabled1(kolon1,kolon2,kolon3)
  select tt.id, chr((32+random()*94)::integer), random() < 0.01
  from generate_series(1,100000) as tt(id)
  order by random();

Verilerimizi yükledik ve indextabled1 tablosunda ki kolon1 içeride ki 91547 kayıtlı verileri bize getirirken nasıl tarama yaptığını görelim.

 explain (costs off )
 select*from indextabled1 where kolon1= 91547

Tablomuzda hiçbir index oluşturulmadığından ve where koşulunda kullandığımız kolon1 de index olmadığından dolayı seqscan yapmaktadır. Where koşulunda kullandığımız kolon1 isimli kolonumuza index oluşturalım ve kullanılan indexe tekrar bakalım.

create index IX_1 on indextabled1(kolon1)

İndeximizi oluşturduktan sonra tekrar explain ile beraber sorgumuzu çalıştırarak  index’in yaptığımı tarama şeklini görelim.

 

Yukarıda görüldüğü gibi indexi oluşturduktan sonra sorgumuz seqscan yerine index scan yapmaktadır.

Kullandığımız örnekte tek where koşulu kullandık peki birden fazla koşul olduğunda ne yapmamız gerekiyor

Tek index içerisinde iki kolon tanımlayabiliyor muyuz? İki ayrı index mi oluşturacağız?   İkisi de yapılabilir  fakat hangisi daha performanslı olacak beraber görelim.

İlk olarak tek index içerisinde iki kolon  tanımlayalım.(Multi Column İndex):

  explain (costs off )
 select*from indextabled1 where kolon1< 21  and kolon2='F'

 

Sorgumuz yukarıdaki sorgu sonucunda   bitmap index scan yaptığı görülmekte  kolon1 ve kolon2 kolonlarını içeren tek bir index oluşturalım.

create index IX_2 on indextabled1(kolon1, kolon2)

Yukarıda görüldüğü gibi Multicolumn index oluşturduğumuzda kayıtları getirirken index yaparak oluşturduğumuz indexi kullandı.

Farklı iki index oluşturmuş olsaydık sonuç ne olacaktı deneyelim ve beraber görelim.

İlk olarak bir önceki örneğimizde ki indexi silelim.

Drop index IX_2;

İndeksimizi sildikten sonra aşağıdaki gibi iki ayrı index oluşturalım.

  create index IX_3 on indextabled1(kolon2)
  create index IX_4 on indextabled1(kolon1)

İki index oluşturduğumuzda çıkarılan query planın daha uzun olduğunu ve gereksiz yere Bitmap heap scan ve oluşturduğumuz indexleri de bitmap index scan yaptığını görüyoruz. İki ayrı index oluşturmak bu sorgu sonucunda daha fazla performans kaybına neden olduğunu görüyoruz. Birden fazla where koşulu olması durumunda bunları ayrı indeksler yapmak yerine tek bir index yapmak hem disk üzerinde daha yer kaplar ve hem daha performanslı çalışır.

Loading