Makale Özeti

İmleçleri kullanırken; onların yeteneklerini, kendi gereksinimlerimize uygun olarak belirlemek hem doğru sonuçlar elde etmemiz hem de performans açısından çok büyük önem taşımaktadır. İmleçleri kullanırken, doğru türleri kullanmamız, ancak bu türlere çok iyi hakim olmamızla mümkündür. İmleç türlerini; iyi bilmek ve doğru kullanmak, imleçlerle yaptığımız çalışmaların kalitesini ortaya koyacak önemli bir nokta olacaktır.

Makale

MSSQL SUNUCUSUNDA İMLEÇ TÜRLERİ


İMLEÇLERE GENEL BİR BAKIŞ

İmleçler, SELECT sorguları sonucunda oluşan sonuç kümeleri içinde gezeek tek tek kayıtlara erişebilmemizi ve bu kayıtlar üzerinde işlem yapmamızı sağlayan nesnelerdir.

SELECT sorguları, bizlere belirlenen mantıksal kriterlere göre bilgiyi daraltma şansı verirler. Ancak bu daraltma işlemi sonucunda oluşan sonuç kümeleri, sorgu için bir bütün(birim) teşkil eder ve bu şekilde değerlendirilir. Bize; oluşan sonuç kümelerinde gezintiler yapma ve sonuç kümesindeki her bir satıra ayrı ayrı erişebilme olanağını,  imleç (cursor) denilen nesneler verir.

İmleçleri kullanmanın iki yöntemi bulunmaktadır:

  • Transact - SQL

  • Veritabanı bağlantı arayüzleri (ADO, OLE DB, ODBC, DB-Library)

Bu iki yöntemden herhangi birini tercih ederek imleçleri kullanmak olanaklıyken, bu yöntemlerin birlikte kullanımına izin verilmemektedir. (Makalede, T-SQL imleçleri temel alınmıştır.)

İmleçler, bize çok esnek programcılık olanağı sunmaktadır. Ancak bu olanağı sağlarken çok yüksek boyutlarda sistem kaynağını tüketmekte ve özellikle tempdb veritabanını yoğun olarak kullanmaktadır. Bu nedenle imleçler, yalnızca gerekli durumlarda kullanılmalıdır. 

İMLEÇ TÜRLERİ

İmleçlerin yeteneklerini ve bu yeteneklerine bağlı olan performanslarını düzenlemek, imleçleri kullanmanın önemli konularından biridir. İmleçlerden fazla yetenek beklemek, pek tabii ki onların performanslarındaki düşüşü göze almaktır. Bu bölümde farklı imleç sınıflandırmaları içerisindeki imleç türleri incelenecektir.

1. FORWARD ONLY / SCROLL

İmleçleri sınıflandırmak için ilk bakış açımız, imleçlerin hareket yönleri açısından sınıflandırma olacaktır. İmleçlerde iki çeşit hareket yöntemi vardır:

  • FORWARD_ONLY

  • SCROLL

FORWARD_ONLY seçeneği varsayılan değerdir* ve imlecin yalnızca ileri yönlü hareket edebileceği anlamına gelmektedir, yani yalnızca FETCH NEXT komutu kullanılarak imleç üzerinde gezinti yapılabilir.

*İmleçlerin diğer bir sınıflandırmasına dayanan STATIC,KEYSET ve DYNAMIC sözcükleri kullanıldığında, varsayılan değer SCROLL olmaktadır. Ayrıca FORWARD_ONLY seçeneği kullanıldığında, varsayılan olarak imleç, DYNAMIC olmaktadır.

Kullanım şu şekildedir:

        DECLARE StatikDizin CURSOR FORWARD_ONLY FOR
        SELECT
* FROM DENEME

Bu şekilde bir tanımlama yapıldıktan sonra FETCH PRIOR komutu kullanılırsa, aşağıdaki şekilde bir hata mesajıyla karşılaşılır.

SCROLL seçeneğiyle imleç içinde ileri - geri yönlü gezinti yapma olanağımız olacaktır.

2. STATIC / KEYSET / DYNAMIC / FAST_FORWARD

İmleçleri sınıflandırırken bir diğer bakış açımız da, imleçlerin güncelleme işlemlerine olan duyarlılığı cinsinden sınıflandırma yapmaktır.

  • STATIC

  • KEYSET

  • DYNAMIC

  • FAST_FORWARD

STATIC imleçler, gezinti işlemlerini gerçekleştirebilmek için tempdb veritabanında geçici bir tablo yaratırlar. En büyük özellikleri, bu imleçler üzeriden veri güncellemesi yapılamaması ve dışarıdan yapılan değişiklerden etkilenmiyor olmalarıdır.

DYNAMIC imleçler, imleç üzerinden veya dışarıdan yapılan tüm veri değiştirmelerine(ekleme, güncelleme ve silme) duyarlıdırlar. Ancak DYNAMIC imleçler, FETCH ABSOLUTE komutunu desteklemezler.

KEYSET imleçlerin özellikleri, STATIC ve DYNAMIC imleç türlerinin özelliklerinin ortasında bulunmaktadır. KEYSET imleçlerde, her bir kayıt için bir anahtar değeri tutulmaktadır ve bu anahtar değerleri tempdb içerisinde keyset denilen tabloda tutulmaktadır. KEYSET imleçler, kendi üzerinden veya dışarıdan yapılan güncellemelere duyarlıdır. Dışarıdan eklenen kayıtlar ise KEYSET imleçler tarafından görümezler. Silme işlemlerinde ise; silinen kayıtlar KEYSET imleçler için kayıp (@@FETCH_STATUS = -2) kayıtlar olarak değerlendirilmektedir ve kaydın içi boş olarak görülmektedir.

FAST_FORWARD imleçler, yalnızca FORWARD_ONLY(salt ileri yönlü) ve READ_ONLY(salt okunur) özelliklere sahiptirler. Ancak, diğer imleç türlerine göre çok daha hızlı çalışmaktadırlar.

3. READ_ONLY / SCROLL_LOCKS / OPTIMISTIC

İmleçler için sınıflandırma bir diğer bakış açımız da, güncelleme aşamasındaki veri bütünlüğü duyarlılıklarına göre bir sınıflandırma yapmaktır.

  • READ_ONLY

  • SCROLL_LOCKS

  • OPTIMISTIC

READ_ONLY imleçler üzerinde güncelleme işlemleri yapılamaz.

SCROLL_LOCKS imleçler, üzerlerinde bulundukları kaydı kilitleyerek, yapılacak güncelleme işlemlerini garantiye alır.

OPTIMISTIC imleçler, üzerlerinde bulundukları kayıtları kilitlemezler. OPTIMISTIC imleçler, üzerinde bulundukları(okudukları) kayıt dışarıdan değiştirilmiş ise, imleç üzerinden güncelleme ve silme işlemleri gerçeklenemez.

* FAST_FORWARD imleçlerle SCROLL_LOCKS veya OPTIMISTIC ifadesi kullanılamaz.

 

Örnek bir tanımlama:

        DECLARE Imlec1 CURSOR KEYSET OPTIMISTIC FOR
        SELECT
FirstName, LastName FROM Employees

 

SONUÇ

İmleçleri kullanırken; onların yeteneklerini, kendi gereksinimlerimize uygun olarak belirlemek hem doğru sonuçlar elde etmemiz hem de performans açısından çok büyük önem taşımaktadır. İmleçleri kullanırken, doğru türleri kullanmamız, ancak bu türlere çok iyi hakim olmamızla mümkündür. İmleç türlerini  iyi bilmek ve doğru kullanmak, imleçlerle yaptığımız çalışmaların kalitesini ortaya koyacak önemli bir nokta olacaktır. 

Not: Konu hakkında daha detaylı bilgi alabilmek için MSSQL Books Online'a başvurunuz.

 

Anıl YÜGEN
anil.yugen@bilgeadam.com

Kaynak : MSSQL Books Online, Cursors