PostgreSQL B-Tree İndex Nedir?
PostgreSQL B-Tree İndex Nedir?
Veritabanı sistemlerinde en çok kullanılan index türlerindendir. Oracle,mssql ve postgresql de varsayılan index türlerinden biridir.
PostgreSQL de CREATE index komutunda USING komutu ile farklı index tipleri seçilebilir. USING komutu belirtilmediği takdirde B-tree index mimarisini kullanacaktır.
B-Tree indexler yukarıda ki resimde görüldüğü gibi parçalı parçalı tutulur. B-tree indexler de veriye ulaşılmak istendiğinde ilk olarak Root level de ki page gider istenilen veri bu root level de ise bu root levelin illgili intermediate leveline gider ve buradan da ilgili leaf level e giderek en kısa yoldan veriyi bulur.
Yukarıda ki Btree yapısından “22” numaralı kayda erişilmek istendiğinde ilk olarak “1-200” arasında bulunan Root levelde ki page e gidilir.Buradan intermediate levels de “1-100” arasında ki page ve sonrasında “1-50” arasında ki intermediate level e giderek bir sonrakine giderek “1-25” arasındaki veri setine gidilerek 24 numaralı kayıt alınarak hızlı bir şekilde veri kullanıcıya döndürülür.
İndex olmayan bir tabloyu yukarda ki gibi düşünebilirsiniz .Bütün noktalara giderek buradaki kayıtları tek tek aramaya çalışacak ve bundan dolayı sorgumuzun dönmesi uzun ve maliyetli olacaktır. İndex olmayan tablolar sadece sorgu sonucunu uzatmaz . Cpu ,disk kullanım oranını arttırır ve veritabanın çalıştığı makineyi cpu,disk olarak dar boğaza düşürür.
B-tree indexler belirli bir sıralamaya göre sıralanabilen veriler üzerinden eşitlik ve aralık sorgularını işlemektedir. PostgreSQL sorgu planlayıcısı özellikle ,aşağıdaki öperatorlerden birini kullanarak bir karşılaştırma, kıyaslama yapıldığında B-tree index’i kullanmaya tercih edecektir.
<
<=
=
>=
>
BETWEEN
IN
IS NULL
NOT NULL
Kolonadi LIKE ‘faruk%’
Kolonadi |\’faruk%’
Yukarıdaki gibi SQL cümleleri de B-Tree index yapısını kullanır.
Genel Kullanımı aşağıdaki gibidir.
CREATE INDEX İndex_adi ON Tablo_Adi USING btree (Kolon_İsmi );
Örnek kullanımı aşağıdaki gibidir.
CREATE INDEX ad ON "Müsteriler"("Adi_Soyadi" )
Address tablomuzda ki district kolonu içerisinde Texas geçen verileri getirmek istiyoruz. Normal sorgu yaptığımızda aşağıdaki şekilde seq scan yaptığını görüyoruz.
Plpgsql sorgumuzda where koşulunda district kolonu olduğu için district kolonuna aşağıdaki şekilde index oluşturuyoruz.
create index IX_address_district on address (district)
İndexi oluşturtuktan sonra aşağıdaki gibi Index Only Scan yaptığını görüyoruz.
İndex tanımlaması yapılırken asc,desc, nulls,null first , null last biçiminde tanımlamalar yapılabilir.
Asc : Ascending şekilde sıralamaya göre indexin oluşturulması için tanımlanır.
Desc : Descending şekilde sıralamaya göre indexin oluşturulması için tanımlanır.
NULL FIRST : Null kayıtların index üzerinde ilk sıralara yerleştirilmesi için kullanılır.
NULL LAST : Null kayıtların index üzerinde son sıralara yerleştirilmesi için kullanılır.
İndex tanımlanırken farklı operatör sınıfları (operator classes) tanımlanabilir . Varchar veri tipi kullanıyorsanız varchar_pattern_ops oluşturabilirsiniz. Karmaşık verilerle uğraşılmadığı takdirde varchar yeterli olacaktır. Operatör sınıflarını kullanabilmek için veritabanın collate’i C olarak ayarlanması gerekmektedir.
Operatör sınıflarının hepsini görmek istiyorsanız aşağıdaki plgpsql komutundan yararlanabilirsiniz.
SELECT am.amname AS index_method,
opc.opcname AS opclass_name
FROM pg_am am, pg_opclass opc
WHERE opc.opcmethod = am.oid
and am.amname='btree'
ORDER BY index_method, opclass_name;