SQL Server’da NewsequentialID Fonksiyonu
Merhaba,
Biliyorsunuz ki, SQL Server’da tarih, saat vs. gibi bilgilerle birlikte bilgisayarın diğer özellikleri ile harmanlanıp ortaya konulan ve dünyada eşi benzeri olmayacak cinsten üretilen değeri UniqueIdentifier türüyle ifade etmekteyiz. Bu tipte bir değeri NewID() fonksiyonu aracılığıyla üretebilmekte ve bu değeri GUID(Globally Unique Identifier) olarak nitelendirmekteyiz. Benzer şekilde NewsequentialID fonksiyonuda küçük bir farkla ilgili değeri üretmemizi sağlamaktadır. Bu içeriğimizde NewsequentialID fonksiyonunun ne olduğundan ve NewID fonksiyonuyla olan farkından bahsedeceğiz.
Öncelikle bu iki faktörün arasındaki farka değinmekle başlayalım. NewID fonksiyonu ile NewsequentialID fonksiyonunun arasında temel fark biri düzensiz değer üretirken(NewID) diğeri sıralı değer üretmektedir(NewsequentialID).
Hemen bu girizgahtan sonra bir örneklendirme yaparak bahsimizi kuvvetlendirmek gerekebilir. Lakin NewsequentialID fonksiyonunun kullanımı ek bilgiler gerektirdiğinden dolayı bu örneklendirmeyi bir kaç paragraf sonrasına bırakmak mecburiyetindeyiz.
NewID() fonksiyonu bildiğimiz gibi her yerde(select, insert vs.) kullanılabilirken, NewsequentialID fonksiyonu bir tek kolonlarda Default Constraint olarak kullanılabilmektedir. Bu durumda aşağıdaki gibi bir problemle karşılaşmaktayız.
NewID | NewsequentialID |
Gördüğünüz gibi NewsequentialID fonksiyonunu Select sorgusunda çağırdığımızda karşımıza bir değer üretip çıkarmamaktadır. Bunun sebebi yukarıda bahsettiğimiz gibi sadece kolon üzerinde Default Constraint ile kullanılmasıdır.
Ki zaten alınan hataya şöyle göz atarsak meali aşağı yukarı aşağıdaki manaya gelmektedir.
NewsequentialID fonksiyonu , tablo üretirken yahut güncellerken UniqueIdentifier türünde bir sütun için Default ifadesiyle(Constraint) kullanılabilir.
Evet, bu demek oluyor ki aşağıdaki gibi bir tablo inşa eder ve UniqueIdentifier türünden bir kolona Default Constraint ile NewsequentialID fonksiyonunu atarsak örneklendirmede es geçtiğimiz paragrafın uygulama kısmını tamamlamış oluruz.
CREATE TABLE Ogrenciler ( ID INT PRIMARY KEY IDENTITY, ADI NVARCHAR(MAX), SOYADI NVARCHAR(MAX), OZELNO UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() )
Şimdi bu tabloya rastgele veriler girelim ve NewsequentialID fonksiyonunun tanımlandığı kolonu inceleyelim.
INSERT Ogrenciler(ADI, SOYADI) VALUES('Gençay', 'Yıldız') INSERT Ogrenciler(ADI, SOYADI) VALUES('Turgay', 'Arslaner') INSERT Ogrenciler(ADI, SOYADI) VALUES('Mevlüt', 'Alçay') INSERT Ogrenciler(ADI, SOYADI) VALUES('Kerem Oğuz', 'Özgür') INSERT Ogrenciler(ADI, SOYADI) VALUES('Selman', 'Candemir') INSERT Ogrenciler(ADI, SOYADI) VALUES('Rıfkı', 'Malkoçlar')
Görüldüğü üzere NewsequentialID fonksiyonu ile oluşturulan değerlerimizde bir sıralılık söz konusu. Amma velakin NewID fonksiyonundan böyle bir sıra ve düzenden bahsetmemiz mümkün değildir. Keza bu güne kadar sayısız kez örneklendirmeler üzerinde kullandığımız için NewID üzerine bu içeriğimizde bir örneğe lüzum görmüyorum…
Gelelim bu sıralı değerlerin bizlere getirisi üzerinde konuşmaya… Yani NewID ile NewsequentialID fonksiyonları arasında hangi durumlarda seçim yapmalıyız? sorunsalına cevap uydurmaya…
UniqueIdentifier türünden değerler genellikle takip edilmesi zor, hesaplanması yahut tahmin edilmesi neredeyse imkansız değerler olduğu için yüksek güvenlikli durumlarda kullandığımız bir değer tipidir. Ee haliyle sıralı değer üreten NewsequentialID fonksiyonu bu türün tahmin edilebilirlik katsayısını arttırdığından dolayı güvenlik üzerinde kararlıysanız NewID fonksiyonuyla çalışmanız tabi ki de daha doğru bir tercih olacaktır. Lakin select, insert ve update işlemlerinde NewsequentialID fonksiyonu ile üretilen değer, NewID’ye nazaran daha hızlı ve az maliyetli şekilde üretilecektir.
Bu olumlu ve olumsuz durumları göz önüne alıp ihtiyacınıza dönük en çok hizmeti ve eşliği edecek fonksiyonu tercih etmek sizlere kalmış…
Sonraki yazılarımda görüşmek üzere…
Şimdilik hoşçakalın…
İyi çalışmalar…