Bugün
Özgül & Selçuk KOÇYİĞİT | Ayakizlerimiz.com

SQL Server 2012 | Yenilikler | SEQUENCE (ORACLE | Sequence Object)

Perşembe, 10 Ocak 2013
Selçuk
SQL Server 2012 | Yenilikler | SEQUENCE (ORACLE | Sequence Object)

SQL Server, Oracle‘ın izinden gitmeye devam ediyor. 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 (SEQUENCE) kullanmanı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-Max değ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 default iç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 tabiki mümkün olabilir.

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

CurrentValue - Sequence

Yorum yapabilmeniz için Giriş yapmalısınız! Üyeliğiniz yoksa ücretsiz olarak üyelik açabilirsiniz..

SQL Server 2012 | Yenilikler | SEQUENCE (ORACLE | Sequence Object) başlıklı içerik için hiç yorum yapılmamış!
İlk yorumu siz yapın.

Copyright © Özgül & Selçuk KOÇYİĞİT | Ayakizlerimiz.com - Özgül & Selçuk KOÇYİĞİT | Ayakizlerimiz.com