ลำดับกำลังใช้ซ้ำ


11

ฉันมีลำดับที่สร้างหมายเลขการติดตามสำหรับวัตถุในระบบของฉัน มันใช้งานได้ดีมาระยะหนึ่งแล้ว

สัปดาห์ที่แล้วเราสังเกตเห็นว่ามันเริ่มที่จะใช้ค่าอีกครั้ง

สิ่งที่น่าจะเกิดขึ้นก็คือในช่วงเย็นที่ต่างกันมันจะย้อนกลับไปสู่ค่าที่เคยมีเมื่อวันก่อน จากนั้นจะสร้างค่าต่อไปจากจุดนั้น

ตัวอย่างเช่นฉันจะได้อะไรแบบนี้

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

ดูเหมือนว่าจะไม่มีรูปแบบใด ๆ เกิดขึ้นระยะเวลาระหว่างการใช้งานครั้งแรกกับการใช้ครั้งที่สอง (น้อยที่สุดเท่าที่ 10 นาทีหรือหลายชั่วโมง) หรือมีการย้อนกลับกี่ครั้ง

ฉันคิดเกี่ยวกับการใช้งานการติดตาม (และยังอาจ) แต่ฉันไม่คิดว่าวัตถุลำดับจะถูกแก้ไขโดยตรง เหตุผลที่ฉันเชื่อว่านี่คือวันที่แก้ไขนั้นมีอายุหลายวันและชี้ไปที่เวลาที่เราชนค่าด้วยตนเองเพื่อลองและกำจัดรายการที่ซ้ำกัน (และปัญหาเกิดขึ้นหลายครั้งตั้งแต่นั้นมา)

ไม่มีใครมีความคิดในสิ่งที่อาจทำให้เกิดการย้อนกลับลำดับและนำค่ากลับมาใช้ในแต่ละคืน?

ปรับปรุง: เพื่อตอบคำถามสองสามข้อในความคิดเห็น:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 ตุลาคม 2555 13:38:57 น

  • สร้างสคริปต์:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
  • ฉันไม่ได้มีข้อ จำกัด ที่ไม่ซ้ำกัน (แต่ฉันวางแผนที่จะใส่) อย่างไรก็ตามนั่นจะช่วยให้ฉันรู้ว่าเมื่อใดที่ฉันได้ใช้มูลค่าซ้ำ ไม่ใช่สิ่งที่ทำให้ค่ารีเซ็ต ฉันใส่งานที่จะได้รับค่าใหม่ทุก ๆ 5 นาทีบันทึกไว้ เวลาและการข้ามค่าไม่เป็นไปตามรูปแบบ

  • ฉันได้ตรวจสอบบันทึกเหตุการณ์เพื่อดูว่ามีข้อผิดพลาดหรือไม่ ความคิดเดียวที่เกิดขึ้นคือ: http://support.microsoft.com/kb/2793634 เรากำลังใช้การแก้ไขวันนี้ ฉันไม่คิดว่าสิ่งเหล่านี้เกี่ยวข้อง แต่อาจเป็นไปได้

1
เหตุใดจึงไม่มีข้อ จำกัด PK หรือไม่ซ้ำกันในคอลัมน์นี้ เมื่อใช้งานแล้วจะมีการใช้งานซ้ำอีกครั้งและคุณไม่จำเป็นต้องคาดเดาว่าจะมาจากที่ใดเว้นแต่รหัสแอปพลิเคชันของคุณจะกลืนข้อผิดพลาดทั้งหมด ...
Aaron Bertrand


คุณสามารถแสดงความหมายของลำดับของคุณได้หรือไม่? นอกจากนี้คุณสามารถตรวจสอบบันทึกข้อผิดพลาดเพื่อดูว่ามีเหตุการณ์สำคัญเกิดขึ้นค้างคืนหรือไม่ (เช่น failover, บริการเริ่มระบบใหม่, ปัญหาหน่วยความจำ ฯลฯ )?
แอรอนเบอร์ทรานด์ด์

2
คือ@@VERSIONอะไร ยังมีอะไรเปลี่ยนแปลงเกี่ยวกับสภาพแวดล้อมหรือไม่ มีรายการเชื่อมต่อที่รายงานสิ่งที่คล้ายกัน OP มีการคิดว่ามันเกี่ยวข้องกับ11.0.3000.0
มาร์ตินสมิ ธ

2
ดี CYCLE บอก SQL Server เป็นหลักว่าคุณโอเคกับการใช้ค่าซ้ำ ฉันไม่รู้เลยว่าทำไมคุณถึงมีปัญหานี้และไม่รู้ว่าคุณจะรู้สาเหตุว่าทำไม (คุณใช้เวลาตรวจสอบสาเหตุที่คุณซื้อยางแบนนานเท่าไหร่ก่อนที่คุณจะเปลี่ยนยางใหม่) ฉันยังคิดว่าทางออกที่ดีที่สุดของคุณคือมีข้อ จำกัด ในการป้องกันการซ้ำซ้อนและเพื่อปิดการแคชโดยหวังว่าจะป้องกันการใช้ซ้ำ
Aaron Bertrand

คำตอบ:


11

ขั้นแรกหากคุณไม่ต้องการที่ซ้ำกันในคอลัมน์นี้รัฐอย่างชัดเจนว่า

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

(หรือคุณอาจต้องการทำให้คีย์หลักหรือเปลี่ยนดัชนีคลัสเตอร์หรือสิ่งที่มีคุณ ... )

ไม่ว่าในกรณีใดการเพิ่มข้อผิดพลาดเมื่อคุณสร้างสำเนาซ้ำนั้นดีกว่าการใส่สำเนาที่สุ่มสี่สุ่มห้าซึ่งคุณจะต้องจัดการในภายหลัง

ถัดไปให้พิจารณาว่า SEQUENCE เป็นเพียงตัวสร้างตัวเลขและโดยค่าเริ่มต้นจะมีแคช 50 ค่า ขึ้นอยู่กับวิธีตั้งค่าธุรกรรมของคุณและเหตุการณ์สำคัญอื่น ๆ ที่เกิดขึ้นบนเซิร์ฟเวอร์เป็นไปได้ว่า SQL Server สามารถ "ลืม" ว่าสร้างค่าบางอย่างสำหรับคุณ ขออภัย แต่ฉันไม่ทราบว่าเกณฑ์ปัจจัยใดที่ทำให้เกิดข้อผิดพลาดนี้อีกครั้ง วิธีที่จะแก้ไขปัญหานี้ (จนกว่าข้อผิดพลาดจะได้รับการแก้ไข / อธิบาย ) คือการเปลี่ยนลำดับการใช้NO CYCLEและNO CACHEเช่น:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

โปรดทราบว่าNO CACHEอาจส่งผลต่อประสิทธิภาพและการทำงานพร้อมกัน แต่จะช่วยขจัดช่องว่างบล็อกที่หายไปและผู้ที่รู้ว่าอาจเป็นปัญหาของคุณ

คุณอาจต้องการยืนยันว่าคุณใช้ Service Pack และ CU ล่าสุด ณ จุดนี้ฉันแนะนำSP1และCU10 ที่มี 3437 ; SP2 จะออก แต่ยังคงมีปัญหาที่สำคัญที่นั่นด้วยการสร้างใหม่ออนไลน์ที่อาจส่งผลกระทบต่อคุณ


ฉันไม่สามารถสำรองข้อมูลได้ ดังนั้นถ้าไม่มี CACHE จะแก้ไขได้นั่นคือสิ่งที่ฉันจะทำ
Vaccano

ฉันคิดว่าอาจมีธุรกรรมที่ก่อให้เกิดสิ่งนี้ แต่หน้าลำดับใน MSDN กล่าวว่า "หมายเลขลำดับถูกสร้างขึ้นนอกขอบเขตของการทำธุรกรรมปัจจุบันพวกเขาจะถูกใช้งานไม่ว่าจะเป็นการทำธุรกรรมโดยใช้หมายเลขลำดับที่ได้รับมอบหมายหรือย้อนกลับ" ดังนั้นฉันจึงทิ้งทฤษฎีการทำธุรกรรมของฉัน ฉันเห็นด้วยจะต้องมีสิ่งอื่นเกิดขึ้น
Vaccano

ปรากฎว่าเพียงแค่ตั้งค่าด้วยNO CYCLEก็เพียงพอแล้ว (อย่างน้อยมันก็ไม่ได้เกิดขึ้นเมื่อคืน) ขอบคุณสำหรับความช่วยเหลือ!
Vaccano

1
การแก้ไข: วัตถุลำดับสร้างค่าลำดับที่ซ้ำกันเมื่อ SQL Server 2012 หรือ SQL Server 2014 อยู่ภายใต้ความกดดันของหน่วยความจำสมมติว่าคุณสร้างวัตถุลำดับที่มีตัวเลือก CACHE เปิดใช้งานใน Microsoft SQL Server 2012 หรือ SQL Server 2014 เมื่ออินสแตนซ์ และการเชื่อมต่อพร้อมกันหลายรายการขอค่าลำดับจากวัตถุลำดับเดียวกันอาจสร้างค่าลำดับที่ซ้ำกัน นอกจากนี้ข้อผิดพลาดการละเมิดคีย์ที่ไม่ซ้ำกันหรือหลัก (PK) เกิดขึ้นเมื่อมีการแทรกค่าลำดับที่ซ้ำกันลงในตาราง
Andomar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.