ค่าคอลัมน์ MASSIVE Identity กระโดดใน SQL Server 2014

Aug 19 2020

ดังนั้นในช่วงกลางของการเข้ารหัสและการทดสอบขั้นพื้นฐานเราจึงเห็นค่า Identity ที่ไม่มีรูปแบบเพิ่มขึ้นอย่างมากสำหรับหลาย ๆ ตาราง เราไม่ทราบถึงเซิร์ฟเวอร์ล่มหรือพยายามดำเนินการจำนวนมาก แต่ DBA กำลังตรวจสอบบันทึก

ช่องว่างไม่ใช่ช่องว่างทั่วไป 1,000 หรือ 10,000 ที่เห็นเมื่อเซิร์ฟเวอร์รีสตาร์ทและเช่นนั้น

ช่องว่างสำหรับApplication_NOคือ 10,410,345 สำหรับตารางที่มี 2,320 แถว

Transaction_Payment_NO เพิ่มขึ้นอย่างน่าอัศจรรย์ 1,712,149,313 สำหรับตารางที่มีสถิติ 685 รายการ

ความคิดใด ๆ เกี่ยวกับสิ่งที่อาจทำให้เกิดการกระโดดขนาดใหญ่และดูเหมือนจะเป็นไปโดยพลการ?

คำตอบ

5 JoshDarnell Aug 19 2020 at 01:06

ผู้กระทำผิดที่เป็นไปได้:

  1. ขั้นตอนการทดสอบจะสร้างแถวจำนวนมากในธุรกรรมจากนั้นย้อนกลับธุรกรรม

นี่เป็นสาเหตุที่เป็นไปได้มากที่สุดตามที่คุณกล่าวว่าคุณกำลังทำการทดสอบ บางทีอาจมีการเรียกใช้การทดสอบอัตโนมัติซึ่งทำการเปลี่ยนแปลงกับตารางเหล่านั้นตรวจสอบผลลัพธ์แล้วย้อนกลับการเปลี่ยนแปลง

ค่าข้อมูลประจำตัวจะไม่ถูกนำมาใช้ซ้ำหลังจากที่มีการย้อนธุรกรรมซึ่งเป็นสาเหตุที่ทำให้คุณเห็นช่องว่างขนาดใหญ่ในสถานการณ์นี้

  1. มีคนใช้RESEEDคำสั่ง

คุณสามารถเปลี่ยนค่า "เอกลักษณ์ต่อไป" ปัจจุบันด้วยตนเองได้ด้วยคำสั่งนี้:

DBCC CHECKIDENT ('dbo.Transaction_Payment_NO', RESEED, 1712149313);

สิ่งนี้ดูเหมือนจะมีโอกาสน้อยกว่าเนื่องจากคุณหรือผู้ดูแลระบบคนใดคนหนึ่งจะต้องออกนอกเส้นทางที่จะทำ ในทำนองเดียวกัน ...

  1. มีคนแทรกค่าเหล่านั้นด้วยตนเอง

คุณสามารถแทรกสิ่งที่คุณต้องการลงในIDENTITYคอลัมน์โดยเรียกใช้คำสั่งนี้ก่อน:

SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
  1. ความล้มเหลวและเริ่มต้นใหม่

คุณได้กล่าวถึงสิ่งนี้ในคำถาม แต่เพียงเพื่อความสมบูรณ์ - SQL Server จะเก็บค่าข้อมูลประจำตัวเพื่อปรับปรุงประสิทธิภาพ แต่ค่าข้อมูลประจำตัวที่จัดสรรไว้ล่วงหน้าเหล่านั้นอาจสูญหายไปได้หากบริการรีสตาร์ทหรือเกิดข้อผิดพลาด AG สิ่งนี้นำไปสู่ช่องว่างที่คาดเดาได้มากขึ้นแม้ว่า (10,000 ใน SQL Server เวอร์ชันที่ทันสมัย)