INDEXLERDE NULL TUNING

26/12/2009, 21:45 | TUNING kategorisinde yayınlandı | Yorum bırakın
Etiketler: , , ,

TABLODA NULL DEĞER ARAMA

Bir tabloda değer girilmemiş olan bir alana ait kayıtları bulunmak istendiğinde tüm tablo baştan sona okunur “full table scan”. İstediğimiz koşula uyan kayıtlar bu şekilde bulunur. Bu tip bir sorgulama yapmak hem disk I/O hem de CPU için çok pahalı bir işlemdir.  Pahalı olmasının nedeni de full table scan yapılarak index kullanılmamasıdır. Indexlerde null değerler tutulmazlar, sadece veri girilmiş olan alanlar indexlerde tutulurlar.
Burada tabloda NULL değeri olan kayıtları daha hızlı bir şekilde ve index kullanarak sorgulama yapmanın 2 yolunu anlatacağım.

 Where X IS NULL  da index kullanma 

SELECT id 

    FROM my_table

    WHERE seq IS NULL

Şeklinde çalışan sorgu tablonun seq kolonunda index olmasına rağmen her defasında full table scan yapmaktadır.

Bu sorgunun index kullanmasını zorlamak için 2 alternatif yol izlenebilir.

a)     My_table tablosunun seq  kolonuna uygulamanız için bir anlami olmayan  default bir değerin verilmesini sağlamak ve kolonu not null yaparak seq kolununda null değer kalmaması sağlandıktan sonra sorgumuzu aşağıdaki gibi değiştirip, daha hızlı sorgulama yapabiliriz.

Örneğin : tablomuza seq  değeri null olan bir kayıt insert edildiğinde seq değerinin default olarak “-1” verilmesi sağlanmalıdır.

alter table my_table modify seq default (-1);

Şimdi sorgumuzu aşağıdaki gibi değiştirmeliyiz.

SELECT id

    FROM my_table

    WHERE seq = -1

b)     My_table tablosundaki seq kolonu üzerinde mevcut olan index drop edilir. Bunun yerine function based index eklenerek istenen sonuç sağlanır. Bunun için yapılması gerekenler;

query_rewrite_enabled  parametresinin değeri TRUE

query_rewrite_integrity parametresinin değeri TRUSTED yapılmalıdır.

Yeni index oluşturulur.

CREATE INDEX NDX_MY_TABLE_1 ON MY_TABLE (NVL(“SEQ”,(-1)));

Burada kullanılan “-1” değeri uygulama tarafından kullanılmayacak olan dummy bir değerdir.

Sogumuz aşağıdaki gibi değiştirilir.

SELECT id

    FROM MY_TABLE

    WHERE nvl(seq , -1) = -1

 Caner BAŞTÜRK

Yorum Yapın »

RSS feed for comments on this post. TrackBack URI

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

WordPress.com'da ücretsiz bir web sitesi ya da blog oluşturun.
Entries ve yorumlar feeds.

%d blogcu bunu beğendi: