Sıra yeniden kullanılıyor


11

Sistemimdeki nesneler için takip numaraları üreten bir sıra var. Oldukça uzun süredir iyi çalışıyor.

Geçen hafta, değerleri tekrar kullanmaya başladığını fark ettik.

Akşam saatlerinde farklı noktalarda bir önceki günkü değerine geri dönecek. Daha sonra bu noktadan değer üretmeye devam edecektir.

Yani örneğin böyle bir şey alabilirim:

10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...

Böyle bir durumda, ilk kullanım ve ikinci kullanım (10 dakika veya birkaç saat kadar az) veya kaçının geri alındığı (1 kadar az ve birkaç yüz kadar) arasında herhangi bir örüntü yoktur.

Bir izleme çalıştırmayı düşündüm (ve hala olabilir), ancak dizi nesnesinin doğrudan değiştirildiğini düşünmüyorum. Bunun değişiklik tarihinin birkaç günlük olması ve kopyaları elemek için değeri manuel olarak çarptığımız bir zamana işaret ettiğine inanıyorum. (Ve sorun o zamandan beri birkaç kez meydana geldi.)

Herkes bir dizi geri alma neden olabilir ve her gece değerleri yeniden kullanmak hakkında bir fikri var mı?

GÜNCELLEME: Yorumlardaki birkaç soruyu cevaplamak için:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 Ekim 2012 13:38:57

  • Komut Dosyası Oluştur:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
    
  • Benzersiz bir Kısıtlamam yok (ama bir tane koymayı planlıyorum). Ancak bu sadece bir değeri yeniden kullandığımda bana yardımcı olacak. Değerlerin sıfırlanmasına neden olan şey değil. Her 5 dakikada bir yeni bir değer elde edeceğim bir iş koydum. Zaman ve değer sıçramaları bir kalıbı takip etmez.

  • Bir hata olup olmadığını görmek için Olay Günlüklerini kontrol ettim. Bunun olduğunu düşünen tek şey şu: http://support.microsoft.com/kb/2793634 Düzeltmeyi bugün uyguluyoruz. Bunların ilgili olduğunu düşünmüyorum, ama olabilir.

1
Neden bu sütunda PK veya Benzersiz kısıtlama yok? Bu durumda, bu yeniden kullanım yakalanacak ve uygulama kodunuz tüm hataları yutmadıkça, nereden geldiğini tahmin etmeye çalışmanıza gerek yok ...
Aaron Bertrand


Dizinizin tanımını gösterebilir misiniz? Ayrıca, bir gecede önemli olayların (ör. Yük devretme, hizmetin yeniden başlatılması, bellek sorunları, vb.) Olup olmadığını görmek için hata günlüğünü kontrol edebilir misiniz?
Aaron Bertrand

2
Nedir @@VERSION? Ayrıca çevre ile ilgili bir şey değişti mi? Orada bir bağlantı öğesi benzer bir şey raporlama. Oradaki OP bununla ilişkili olduğunu düşünüyor11.0.3000.0
Martin Smith

2
CYCLE aslında SQL Server'a değerleri yeniden kullanma konusunda iyi olduğunuzu söyler. Neden bu sorunu yaşadığınıza dair hiçbir fikrim yok ve nedenini bulacağınızı bilmiyorum (sadece lastiği değiştirmeden önce neden düz bir lastiğe sahip olduğunuzu araştırmak için ne kadar zaman harcıyorsunuz?). Yine de en iyi seçeneğiniz, kopyaları önlemek için orada bir kısıtlamaya sahip olmak ve yeniden kullanımı önleme umuduyla önbelleği kapatmaktır.
Aaron Bertrand

Yanıtlar:


11

İlk olarak, bu sütunda yinelenen istemiyorsanız, bunu açıkça belirtin .

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(Veya birincil anahtarı yapmak veya kümelenmiş dizini değiştirmek veya neye sahip olduğunuzu değiştirmek isteyebilirsiniz ...)

Her halükarda, bir kopya oluşturduğunuzda bir hata oluşturmak, daha sonra ilgilenmeniz gereken bir kopyayı körü körüne eklemekten çok daha iyidir.

Sonra, bir SIRALAMA sadece bir sayı üreteci olduğunu ve varsayılan olarak 50 değerlik bir önbelleğe sahip olduğunu düşünün. İşlemlerinizin nasıl ayarlandığına ve bir sunucuda diğer kritik olayların gerçekleşmesine bağlı olarak, SQL Server'ın sizin için belirli değerler ürettiğini "unutabilir". Maalesef, bu hatayı çoğaltmak için hangi kriterlerin faktörünü tam olarak bilmiyorum. Bu sorunu aşmanın yolu ( hata çözülene / açıklanıncaya kadar ) kullanılacak sırayı değiştirmek NO CYCLEve NO CACHEörneğin:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Not NO CACHEçok belki sorununuzu bilen performans ve tutarlılık etkileyebilir, ancak boşlukları ortadan kaldırmaya yardımcı olur, kayıp bloklar ve.

Ayrıca, en son hizmet paketinde ve CU'da olduğunuzu doğrulamak da isteyebilirsiniz. Bu noktada 3437 ile SP1 ve CU10'u öneririm ; SP2 çıktı ama hala sizi etkileyebilecek çevrimiçi yeniden oluşturma ile ilgili kritik bir sorun var .


Yedeklemesini sağlayamıyorum. Yani hiçbir önbellek sorunu çözemezse, o zaman yapacağım şey budur.
Vaccano

Buna neden olan işlemler olabileceğini düşündüm. Ancak MSDN'deki Sekans sayfası, "Sekans numaraları geçerli işlemin kapsamı dışında oluşturulur. Sıra numarasını kullanan işlemin yerine getirilip getirilmediği veya geri alındığı tüketilir." Bu yüzden işlem teoremi attım. Başka bir şey olması gerektiğine katılıyorum.
Vaccano

Sadece onu ayarlamanın NO CYCLEyeterli olduğu ortaya çıkıyor. (En azından dün gece olmadı.) Yardımın için teşekkürler!
Vaccano

1
Düzeltme: SQL Server 2012 veya SQL Server 2014 bellek baskısı altındayken dizi nesnesi yinelenen dizi değerleri üretir Microsoft SQL Server 2012 veya SQL Server 2014'te CACHE seçeneği etkinleştirilmiş bir dizi nesnesi oluşturduğunuzu varsayın. Örnek bellek baskısı altında olduğunda ve birden çok eşzamanlı bağlantı aynı dizi nesnesinden dizi değerleri ister, yinelenen dizi değerleri oluşturulabilir. Ayrıca, yinelenen sıra değeri bir tabloya eklendiğinde benzersiz veya birincil anahtar (PK) ihlali hatası oluşur.
Andomar
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.