Sıra ve kimlik


87

SQL Server 2012 Sequence, Oracle ve Postgres'te olduğu gibi yeni bir özellik olarak tanıtıldı . Kimlikler yerine diziler nerede tercih edilir? Ve neden dizilere ihtiyacımız var?


Her ikisini de kullandıktan sonra, bir veritabanında global kullanım için Identity'yi tercih ediyorum. Yani, ObjectID gibi otomatik artan bir sayıya ihtiyacınız olduğu ve bunu birçok tabloda kullanmak istediğiniz yerdir. Sıra numarasına göre tablo eklemeyi ve güncellemeyi yönetmek için bir sıralama yapmak ve ardından bir uygulama (web sitesi veya uygulama vb.) Kullanmak karmaşıklaşır.
cilt

Yanıtlar:


81

Sanırım cevabını burada bulacaksın

Bir sütun için kimlik özniteliğini kullanarak, kolayca otomatik artan sayılar (çoğu zaman birincil anahtar olarak kullanılır) oluşturabilirsiniz. Sıra ile, eklerken bir tablo sütununa ekleyebileceğiniz farklı bir nesne olacaktır. Kimliğin aksine, sütun değeri için bir sonraki sayı diskten ziyade bellekten alınacaktır - bu, Sırayı Kimlikten önemli ölçüde daha hızlı hale getirir. Bunu önümüzdeki örneklerde göreceğiz.

Ve burada :

Sıralar: Sıralar, SQL Server topluluğu tarafından yıllardır talep edilmektedir ve bu sürüme dahil edilmiştir. Sıra, bir sayı dizisi oluşturan kullanıcı tanımlı bir nesnedir. İşte Sequence kullanan bir örnek.

ve burada da:

Bir SQL Server sıra nesnesi, sql tablolarındaki bir kimlik sütunu gibi bir sayı dizisi üretir. Ancak sıra numaralarının avantajı, sıra numarası nesnesinin tek bir sql tablosu ile sınırlı olmamasıdır.

ve msdn'de kullanım ve buna neden ihtiyacımız olduğu hakkında daha fazla bilgi edinebilirsiniz ( burada ):

Bir dizi, dizinin yaratıldığı belirtime göre bir sayısal değerler dizisi oluşturan, kullanıcı tanımlı şemaya bağlı bir nesnedir. Sayısal değerler dizisi, tanımlanmış bir aralıkta artan veya azalan bir sırada üretilir ve istendiği gibi döngü yapabilir (tekrarlayabilir). Diziler, kimlik sütunlarının aksine tablolarla ilişkilendirilmez. Bir uygulama, bir sonraki değerini almak için bir dizi nesnesine başvurur. Sıralar ve tablolar arasındaki ilişki uygulama tarafından kontrol edilir. Kullanıcı uygulamaları bir sıra nesnesine başvurabilir ve değer anahtarlarını birden çok satır ve tablo arasında koordine edebilir.

CREATE SEQUENCE deyimi kullanılarak tablolardan bağımsız olarak bir dizi oluşturulur. Seçenekler, performansı artırmak için artışı, maksimum ve minimum değerleri, başlangıç ​​noktasını, otomatik yeniden başlatma özelliğini ve önbelleğe almayı kontrol etmenizi sağlar. Seçenekler hakkında bilgi için bkz. SIRA OLUŞTURMA.

Satırlar eklendiğinde oluşturulan kimlik sütun değerlerinden farklı olarak, bir uygulama, NEXT VALUE FOR işlevini çağırarak satırı eklemeden önce sonraki sıra numarasını elde edebilir. Sıra numarası, numara hiçbir zaman tabloya eklenmemiş olsa bile NEXT VALUE FOR çağrıldığında tahsis edilir. NEXT VALUE FOR işlevi, bir tablo tanımındaki bir sütun için varsayılan değer olarak kullanılabilir. Aynı anda birden çok sıra numarası aralığı elde etmek için sp_sequence_get_range öğesini kullanın.

Bir dizi, herhangi bir tamsayı veri türü olarak tanımlanabilir. Veri türü belirtilmezse, bir dizi varsayılan olarak bigint olur.


21

Sıra ve özdeşliğin her ikisi de otomatik numara oluşturmak için kullanılır, ancak en büyük fark Özdeşliğin tabloya bağlı olması ve Sıranın tablodan bağımsız olmasıdır.

Küresel olarak (birden çok tabloda) bir otomatik numara tutmanız gereken bir senaryonuz varsa, belirli bir sayıdan sonra aralığınızı yeniden başlatmanız ve performans için de önbelleğe almanız gerekiyorsa, burada sıraya ihtiyacımız var Kimlik.


14

Diziler, kimlik sütunlarından daha fazla esneklik sağlasa da, herhangi bir performans avantajı olduğunu bulamadım.

Kimlik kullanarak performansın, toplu eklemeler için sıra kullanmaya göre tutarlı bir şekilde 3 kat daha hızlı olduğunu buldum.

Yaklaşık 1,5 milyon satır ekledim ve performans:

  • Kimlik için 14 saniye
  • Sıra için 45 saniye

Satırları, bir tablo varsayılanı aracılığıyla sıra nesnesi kullanan bir tabloya ekledim:

NEXT VALUE for <seq> for <col_name>

ve ayrıca select deyiminde sıra değeri belirtmeyi denedi:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Her ikisi de özdeşlik yönteminden daha yavaş aynı faktördü. Dizi için varsayılan önbellek seçeneğini kullandım.

Arion'un ilk bağlantısında atıfta bulunulan makale, satır satır ekleme için performansı gösterir ve özdeşlik ve sıra arasındaki fark 10.000 ekleme için 16.6 saniye ila 14.3 saniye olmuştur.

Önbelleğe alma seçeneğinin performans üzerinde büyük bir etkisi vardır, ancak daha yüksek hacimler için (+ 1 milyon satır) kimlik daha hızlıdır

Utly4life'ın yorumuna göre derinlemesine bir analiz için bu bağlantıya bakın .


Dizinin önbellek boyutu neydi.
Shannon Kıdemliliği

50, arttırmak bir fark yaratıyor, ancak kimliğin hala daha hızlı olduğunu hatırlıyorum.
Stagg

2
byobi.com/blog/2012/09/… Çeşitli konfigürasyonların ayrıntılı ve iyi bir karşılaştırmasını sağlar. Önbellek boyutundaki 50'den 500'e artışın yaklaşık 2 kat hız farkı sağladığını gösterir.
ulty4life

1
Dizilerin kimlik sütunundan daha yavaş olduğunu mu söylüyorsunuz? Diskten getirilen kimliğin aksine diziler bellekte olduğu için zıt bir izlenimim vardı. Bulgularınız oldukça şaşırtıcı. Paylaştığına sevindim.
RBT

1
sıra ile alter sequence increment by ..., yeni satırlarınız için yer açmak için kullanarak toplu ekleme performansını optimize edebilir ve ardından temel + satır_sayı () veya gerçek değerler için herhangi bir şey kullanabilirsiniz.
gordy

6

Bunun biraz eski olduğunu biliyorum ama beni ısırtan bir gözlem eklemek istedim.

Dizinlerimi sıraya koymak için kimlikten sıraya geçtim. Daha sonra dizinin replikasyonla aktarılmadığını öğrendim. İki veritabanı arasında replikasyon kurduktan sonra diziler senkronize olmadığından anahtar ihlalleri almaya başladım. sadece bir karar vermeden önce dikkat etmeniz gereken bir şey.


3

Sıraların en iyi kullanımının bir kimlik sütununu değiştirmek değil, "Sipariş Numarası" türü bir alan oluşturmak olduğunu düşünüyorum.

Başka bir deyişle, bir Sipariş Numarası son kullanıcıya sunulur ve onunla birlikte iş kuralları olabilir. Benzersiz olmasını istiyorsunuz, ancak sadece bir Kimlik Sütunu kullanmak da gerçekten doğru değil.

Örneğin, farklı sipariş türleri farklı bir sıra gerektirebilir, bu nedenle şirket içi siparişlerin aksine İnternet Siparişi için bir sıranız olabilir.

Başka bir deyişle, bir Sırayı kimliğin yerine geçecek kadar basit düşünmeyin, bir kimliğin iş gereksinimlerine uymadığı durumlarda yararlı olduğunu düşünün.


1

Son zamanlarda, özdeşliğe karşı sıra açısından dikkate alınması gereken bir şey ısırıldı. Görünüşe göre MSFT, kimliği boşluklar olmadan korumak istiyorsanız artık sıra öneriyor. Kimlikte büyük boşlukların olduğu bir sorunumuz vardı, ancak vurgulanan bu ifadeye dayanarak, SQL'in kimliği önbelleğe aldığını ve yeniden başlattıktan sonra bu sayıları kaybettiğimizi açıklayacaktık.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Sunucunun yeniden başlatılmasından veya diğer hatalardan sonraki ardışık değerler - SQL Server, performans nedenleriyle kimlik değerlerini önbelleğe alabilir ve bir veritabanı hatası veya sunucunun yeniden başlatılması sırasında atanan değerlerden bazıları kaybolabilir. Bu, eklendikten sonra kimlik değerinde boşluklara neden olabilir. Boşluklar kabul edilebilir değilse, uygulama anahtar değerleri oluşturmak için kendi mekanizmasını kullanmalıdır. NOCACHE seçeneğiyle bir sıra oluşturucu kullanmak, boşlukları asla taahhüt edilmeyen işlemlerle sınırlayabilir.


1
Orada atlama neden için oldukça iyi bir cevaptır IDENTITYnumaraları bağlantı ve SEQUENCEburada açıklandığı şekilde aynı sorunu var bağlamak ama daha küçük bir ÖNBELLEK boyutunu ayarlayarak sınırlandırabilirsiniz ama sonra hızla bir ters orantı vardır yoktur.
Mrphin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.