23 Ekim 2014 Perşembe

Sequence ve Identity kullanımında atlamalara dikkat!

Merhaba,

Bu sabah aşağıdaki makaleyi okurken Identity'lerdeki atlamaların mantığını anladım. Kendi makinemdeki test amaçlı kurulu bir VM'de de test ettim.

Öncelikle bu sorunu bir projede fark etmiştim, bir kişinin makinesine (dizüstü bilgisayar) bir veritabanıyla birlikte çalışan bir uygulama kurmuştuk, SQL Server Express Edition'ı da yükledik tabii makineye. Sonra zaman zaman tablolardaki Identity değerlerinde zıplamalar olduğunu görmüş, ama buna anlam verememiştik.

Aşağıdaki Itzik'in makalesinde nedeni anlaşılıyor. Yaptığım testlerde de doğruladım. Örneğin aşağıdaki gibi bir tablo oluşturun:

-- Tablo oluştur
CREATE TABLE t1_identityCacheTest(i INT IDENTITY(1,1))
-- İçine kayıt koy
INSERT INTO t1_identityCacheTest DEFAULT VALUES
INSERT INTO t1_identityCacheTest DEFAULT VALUES
-- Kayıtları göster
SELECT * FROM t1_identityCacheTest
-- Sonuç:
2
-- SQL Server Instance'ı bir Failover Clustering senaryosunda Failover oluyormuş gibi veya bir Availability Groups senaryosunda Node değiştiriyormuş gibi birden servis kapansın (Task Manager -> End process).

-- SQL Server servisini tekrar başlat
-- İçine kayıt koy
INSERT INTO t1_identityCacheTest DEFAULT VALUES
-- Kayıtları göster
SELECT * FROM t1_identityCacheTest
-- Sonuç:
1002

Bunun nedeni ise SQL Server 2012 ile birlikte artık varsayılan olarak Identity (ve tabii Sequence için) Cache kullanılması. Cache kullanılması Identity ve Sequence performansı için çok iyi oluyor, performans testini de yapmış Itzik.

Arkadaşın makineye kurduğumuz uygulamanın Identity'li tablolarındaki atlamanın nedeni ise, adamın dizüstü makinesini çat diye kapıyor oluşuydu.

Bunların yanında şunu da tekrar hatırlatmakta fayda var, Cache kullanılmasa bile Identity'lerde atlama / boşluk olasılığı her zaman var, örneğin hata alan bir işleminizdeki Identity numarasının boş kalması gibi...

Itzik'in makalesi:

Kolay gelsin,
Ekrem Önsoy

Hiç yorum yok: