Makale Özeti

SQL Server 2012 ile beraber gelecek olan yeni özelliklerden SEQUENCE nesnesi, bu nesnenin kullanım alanları, faydaları anlatılmaktadır.

Makale

SQL Server 2012 ile gelecek yeni özelliklerden biri de Oracle‘da yıllardır yoğun bir şekilde kullanılan “SEQUENCE” nesnesi olarak duyruldu.

Yıllardır Sql Server, Oracle’daki bu yapıyı kendi içinde kurduğu Identity Column ile karşılamaya çalışmaktaydı. Amaç sadece bir tablo da otomatik artan bir sayı içeren sutun oluşturmak ise tabiki bu yeterliydi.  Fakat birçok durumda, ihtiyacınız bu kadar basit olmuyor. Özellikle ortak bir üreteçten ardışık olarak sayı alması gereken durumlarda bu sistem tıkanıyordu.

Örneğin sizin için farklı ana özellikleri olan bir kaç ürüne ait, farklı tablolar tasarlama ihtiyacınızı, hiç bir şekilde tek bir yerden beslenen bir ürün_id kullanamıyordunuz. Çünkü her bir tablonuz, ancak ve ancak kendi içindeki otomatik artan bir değerden besleniyordu.  Sekanslar ile artık bu gibi durumlar da yönetilebilecek.

Ya da, henüz kaydı eklemeden elinizde ekleyeceğiniz değerinin olmasına ihtiyaç duyuyor olabilirsiniz. Bu değeri kullanarak bir klasörleme yaptığınızı (D:/Resimler/IdentityColumnDegeri/a.png … gibi) ve insert ettiğiniz verinin bir sutununda da bu path’i yazdığınızı düşünün… Identity Column’lu durum da insert ettikten sonra, yine aynı kaydı tekrar update etmeniz gerecektir. Halbuki Sequence gibi harici bir nesne ile bu durumu da kolaylıkla yönetebileceksiniz.

Sekans (SEQUENCEkullanmanın sağladığını bir diğer avantajda performanstır. Sadece kendi içinde sunduğu “Cache” özelliği ile değil, kendi başına yaşayan nesneler olduğu için,  nerde kaldığı, bir sonraki değerinin ne olduğu bilgilerini kendi içinde çok daha efektif bir şekilde tutabilmektedir.

Sequence‘ın Identity Column‘dan üstün diğer özellikleri de Min-Maxdeğerlerini, yani kaçtan başlayacağını ve kaça kadar devam edeceğini, kaçar kaçar gideğini (ki bu Identity Column’da da mevcut) sizin belirliyor olmanız. İhtiyacınıza göre Cycle ile Max değerine ulaştığında tekrar baştan başlamasını sağlayabiliyorsunuz. (Ya da No Cycle‘ı tercih edebilirsiniz :) )

Yine Identity Column’da olmayan bir başka özellikte, her ne kadar Sequence’lar değişmez (immutable) olarak bilinse de, Alter ya da Drop-Create ile bir sonraki değerini dilediğiniz bir değere çekebilirsiniz. Örneğin, tablonuzdan 1000 adet veri sildiniz, bir sonraki değerinizin 1000 sonrasından değilde, bir sonrasından devam etmesini istiyorsunuz. Bunu Identiy Column ile yapamazken, Sequence’lar ile yapabilirsiniz. Çünkü Sequence yönetimi sizde ve bu herhangi bir tablo ile direk ilişkili değil. Bir sonraki değeri tablo üzerindeki bir sutuna endeksli değil.

Sql Serverda Sequence aşağıdaki script ile oluşturabilirsiniz.

CREATE SEQUENCE SEKANS_ADI
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]


CREATE SENQUENCE S_TABLO_ADI as INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 10000
CACHE 10
NO CYCLE

Ya da Sql Server Management Studio üzerinden;

Sequence - SQL SERVER 2012

Create Sequence

New SequenceSorgularınızda (ağırlık olarak insert scriptlerinizde) da

NEXT VALUE FOR S_TABLO_ADI

ile kullanabilirsiniz. Fakat unutmamanız gereken kullanıp ya da kullanmanızdan bağımsız olarak NEXT VALUE ile çağırdığınız anda sekansınızın değeri bir(ya da kaç belirlediyseniz) artacaktır. Herhangibir transaction (BEGIN TRAN ROLLBACK TRAN) bloğu içinde kullansanız dahi, sekans farklı bir anlanda çalıştığı için değeri çağrıldığı anda artacaktır.

SEQUENCE - ROLLBACK

Oracle’dan farklı olarak SQL Server’ın getirdiği bir kullanım şıklığı ise, tablonuzu oluştururken, ilgili sutunu aynı Identity Column tanımlar gibi, değerini defaultiçinde sekans nesnesinden almasını belirleyebiliryorsunuz.

CREATE TABLE TABLO(
TABLO_ID INT default (next value for dbo.Seq)
)
GO

Fakat henüz bir sekansın mevcut değerinin (CURRENT VALUE) ne olduğunu SQL Server da direk alamıyor olmamız kanımca eksik kalmış bir noktadır. Ürün henüz RC0 versiyonunda olduğu için, Release olana kadar ekleme ihtimalleri de tabi ki mümkün olabilir.

SELECT   current_value
FROM sys.sequences
WHERE name = 'S_TABLO_ADI' ;

CurrentValue - Sequence

Görüşmek üzere,

Mehmet Özakan

www.mehmetozakan.com