MSSQL Server Execution Plan RID Lookup Operatörü

Bu makalede RID Lookup operatörünü görmüş olacağız. Öncelikli bu operatörün  ne işe yaradığına değinelim. RID (Row Identifier) Lookup, bir Non-Clustered Index kullanıldığında ancak sorgu içindeki tüm sütunlar o indekste bulunmadığında gerçekleşir.
* SQL Server önce indekse gider (Index Seek).
* İndekste veriyi bulur, ancak SELECT içindeki diğer sütunları almak için satırın fiziksel konumuna (RID) ihtiyaç duyar.
* Heap yapısındaki bir tabloda o satırı bulmak için geri döner ve veriyi çeker.

Kısacası RID Lookup operatörü tablomuzda clustered index veya primary key olmadığı durumlarda tablomuz Heap Table yapısında ise  görülen bir operatördür.

Yukarıdaki sorgumuzda ModifiedDate kolunu için NonClustered index yapısını kullandığı daha sonra  clustered id olmadığı için row id değeri ile gerçek tablomuza bağlanıp diğer verilerin gelmesini sağladık. Index seek yapılmasının sebebi indexsin tarih kolonuna göre ilk sırada olmasıdır. Tarih kolonu indexsin ilk kolonu hariç herhangi bir sırada olmuş olsaydı index scan işlemi gerçekleşmiş olacaktı.

İlk olarak index seek operatör yapısının Tooltip yapısını inceleyelim.

Tooltip penceremizin en alt kısmına baktığımızda Output List kısmında “Bmk1000” şeklinde bir ifade yer almaktadır. “Bmk1000” değeri yapılan Indeks Seek işlemi ile ilişkili olarak bir tane de Bookmark Lookup işleminin gerçekleştirileceği anlamını taşımaktadır. RID Lookup işlemi yapılırken tablodaki her kayıt Row Identifier denilen benzersiz bir Key ile eşleştirilir. Diğer bir ifadeyle tablodaki veriler sanal bir clustered indeks ile temsil edilip veriye erişilirken bu indeks kullanılacaktır. Fakat bu işlem her ne kadar sanal da olsa clustered bir indeks kullanmış olsa bile Lookup işlemi olduğu için fazladan işlem yapılmakta olup bu işleminde sorgumuza azımsanmayacak bir maliyeti vardır. Bu yüzden diğer Lookup işlemleri gibi bu Lookup işleminden de kaçınmamız gerekmektedir. Bunun için de yukarıdaki bahsettiğimiz gibi özellikle büyük tablolar için en az bir tane Clustered indeks oluşturmamız gerekmektedir.

Şimdi de Execution planımızdaki asıl kısım olan RID Lookup operatörünü inceleyelim. Bu operatörde diğer Lookup operatörleri gibi Lookup işlemi yapmak için kullanılmaktadır. Şimdi RID Lookup operatörü üzerine gelip kısaca Tooltip penceremizi inceleyelim.

Execution planda bulunan RID Lookup parametresinin Tooltip penceresini gözlemleyelim.

Yukarıdaki Tooltip   penceresindeki  Seek  Predicates kısmını incelediğimizde

Seek Keys[1]: Prefix: Bmk1000 = Scalar Operator([Bmk1000])

Bu ifade bir önceki incelediğimiz indeks Seek operatöründeki Output List kısmında karşılaştığımız “Bmk1000” değeri istediğimiz veriye erişmek için Lookup Key olarak kullanılmıştır. Yukarıda da belirtildiği gibi RID Lookup operatörü de fazladan Lookup işlemi yapıldığı için özellikle çok fazla kaydın tutulduğu tablolarda bu işlemden olabildiğince kaçınılmalıdır. Bunun için de daha önce belirttiğimiz gibi ya clustered indeks oluşturulmalı ya da cover indeks kullanılmalıdır.

Tablomuzun üzerinde yukarıdaki ekran resminde belirtilen index yapısını sildiğimizde sorgumuz Table scan ile sonuç döndürecektir.

Covering index yapısı ile RID Lookup’ı engelleyebiliriz. Bunun için RID Lookup ile çekilen diğer kolunların inclued olarak eklenmesi gerekmektedir.

Örnek vermek gerekirse:

Mevcut indeks sadece Ad sütununu tutuyorsa RID Lookup yapar:

CREATE INDEX IX_Musteri_Ad ON Musteriler (Ad);

Kapsayan indeks yaparak RID Lookup’ı engelleyebilirsiniz:

CREATE INDEX IX_Musteri_Ad_Kapsayan ON Musteriler (Ad) INCLUDE (Soyad, Email);

Bu makalede RID Lookup operatörüne değinmiş olduk. Başka bir makalede görüşmek dileğiyle..

“Şüphesiz, Rabbin sana verecek ve sen de hoşnut olacaksın.”. Duha Süresi-5 Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir