ลำดับและเอกลักษณ์


88

SQL Server 2012 เปิดตัวSequenceเป็นคุณลักษณะใหม่เช่นเดียวกับใน Oracle และ Postgres ลำดับไหนเป็นที่ต้องการมากกว่าอัตลักษณ์? และทำไมเราต้องมีลำดับ?


หลังจากใช้ทั้งสองอย่างฉันชอบ Identity สำหรับการใช้งานทั่วโลกในฐานข้อมูล นั่นคือที่ที่คุณต้องการตัวเลขที่เพิ่มขึ้นอัตโนมัติเช่น ObjectID และต้องการใช้ในหลาย ๆ ตาราง มันซับซ้อนในการสร้างลำดับจากนั้นใช้แอพพลิเคชั่น (เว็บไซต์หรือแอพ ฯลฯ ) เพื่อจัดการการแทรกและอัปเดตตารางตามหมายเลขลำดับ
Volume one

คำตอบ:


81

ฉันคิดว่าคุณจะพบคำตอบของคุณที่นี่

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

และที่นี่ :

ลำดับ: ลำดับได้รับการร้องขอจากชุมชน SQL Server เป็นเวลาหลายปีและรวมอยู่ในรุ่นนี้ ลำดับคืออ็อบเจ็กต์ที่ผู้ใช้กำหนดซึ่งสร้างลำดับของตัวเลข นี่คือตัวอย่างการใช้ Sequence

และที่นี่เช่นกัน:

ออบเจ็กต์ลำดับ SQL Server สร้างลำดับของตัวเลขเช่นเดียวกับคอลัมน์ข้อมูลประจำตัวในตาราง sql แต่ข้อดีของหมายเลขลำดับคืออ็อบเจ็กต์หมายเลขลำดับไม่ จำกัด ด้วยตาราง sql เดียว

และใน msdn คุณยังสามารถอ่านเพิ่มเติมเกี่ยวกับการใช้งานและเหตุผลที่เราต้องการได้ ( ที่นี่ ):

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

ลำดับถูกสร้างขึ้นโดยไม่ขึ้นกับตารางโดยใช้คำสั่ง CREATE SEQUENCE ตัวเลือกช่วยให้คุณสามารถควบคุมการเพิ่มขึ้นค่าสูงสุดและต่ำสุดจุดเริ่มต้นความสามารถในการรีสตาร์ทอัตโนมัติและการแคชเพื่อปรับปรุงประสิทธิภาพ สำหรับข้อมูลเกี่ยวกับตัวเลือกโปรดดูสร้างลำดับ

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

ลำดับสามารถกำหนดเป็นชนิดข้อมูลจำนวนเต็มใดก็ได้ หากไม่ได้ระบุชนิดข้อมูลลำดับจะมีค่าเริ่มต้นเป็น bigint


21

ลำดับและเอกลักษณ์ที่ใช้ในการสร้างหมายเลขอัตโนมัติ แต่ข้อแตกต่างที่สำคัญคือ Identity ขึ้นอยู่กับตารางและลำดับไม่ขึ้นอยู่กับตาราง

หากคุณมีสถานการณ์ที่คุณต้องรักษาหมายเลขอัตโนมัติไว้ทั่วโลก (ในหลาย ๆ ตาราง) นอกจากนี้คุณต้องรีสตาร์ทช่วงเวลาของคุณหลังจากหมายเลขเฉพาะและคุณต้องแคชด้วยเพื่อประสิทธิภาพนี่คือสถานที่ที่เราต้องการลำดับไม่ใช่ เอกลักษณ์.


14

แม้ว่าลำดับจะให้ความยืดหยุ่นมากกว่าคอลัมน์ข้อมูลประจำตัว แต่ฉันไม่พบว่ามีประโยชน์ด้านประสิทธิภาพเลย

ฉันพบว่าประสิทธิภาพโดยใช้ข้อมูลประจำตัวเร็วกว่าการใช้ลำดับสำหรับการแทรกแบตช์อย่างต่อเนื่อง 3 เท่า

ฉันแทรกประมาณ 1.5 ล้านแถวและประสิทธิภาพคือ:

  • 14 วินาทีสำหรับการระบุตัวตน
  • 45 วินาทีสำหรับลำดับ

ฉันแทรกแถวลงในตารางซึ่งใช้วัตถุลำดับผ่านค่าเริ่มต้นของตาราง:

NEXT VALUE for <seq> for <col_name>

และยังพยายามระบุค่าลำดับในคำสั่งที่เลือก:

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

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

บทความที่อ้างถึงในลิงก์แรกของ Arion แสดงให้เห็นประสิทธิภาพของการแทรกทีละแถวและความแตกต่างระหว่างเอกลักษณ์และลำดับคือ 16.6 วินาทีถึง 14.3 วินาทีสำหรับการแทรก 10,000 ครั้ง

ตัวเลือกการแคชมีผลกระทบอย่างมากต่อประสิทธิภาพ แต่ข้อมูลประจำตัวจะเร็วกว่าสำหรับไดรฟ์ข้อมูลที่สูงขึ้น (+ 1M แถว)

ดูลิงค์นี้สำหรับการวิเคราะห์เชิงลึกตามความคิดเห็นของ utly4life


ขนาดแคชของลำดับคืออะไร
Shannon Severance

50 การเพิ่มขึ้นมันสร้างความแตกต่าง แต่ฉันจำได้ว่าตัวตนยังเร็วกว่า
Stagg

2
byobi.com/blog/2012/09/… ให้รายละเอียดการเปรียบเทียบการกำหนดค่าต่างๆ แสดงให้เห็นว่าการเพิ่มขนาดแคชจาก 50 เป็น 500 ทำให้ความเร็วแตกต่างกันประมาณ 2 เท่า
ulty4life

1
คุณแนะนำให้ลำดับช้ากว่าคอลัมน์ประจำตัวหรือไม่? ฉันมีความรู้สึกตรงกันข้ามเนื่องจากลำดับอยู่ในหน่วยความจำซึ่งแตกต่างจากข้อมูลประจำตัวที่ดึงมาจากดิสก์ การค้นพบของคุณค่อนข้างน่าแปลกใจ ดีใจที่คุณแบ่งปัน
RBT

1
ด้วยลำดับคุณสามารถเพิ่มประสิทธิภาพการแทรกแบตช์โดยใช้alter sequence increment by ...เพียงแค่ทำให้มีที่ว่างสำหรับแถวใหม่ของคุณจากนั้นใช้ base + row_number () หรืออะไรก็ตามสำหรับค่าจริง
gordy

6

ฉันรู้ว่ามันเก่าไปหน่อย แต่อยากจะเพิ่มข้อสังเกตที่ทำให้ฉันรู้สึกแย่

ฉันเปลี่ยนจากเอกลักษณ์เป็นลำดับเพื่อให้ดัชนีของฉันเรียงตามลำดับ ฉันพบในภายหลังว่าลำดับไม่ได้ถ่ายโอนด้วยการจำลองแบบ ฉันเริ่มได้รับการละเมิดที่สำคัญหลังจากที่ฉันตั้งค่าการจำลองแบบระหว่างสองฐานข้อมูลเนื่องจากลำดับไม่ได้ซิงค์กัน เป็นเพียงสิ่งที่ต้องระวังก่อนตัดสินใจ


3

ฉันพบว่าการใช้ลำดับที่ดีที่สุดไม่ใช่การแทนที่คอลัมน์ข้อมูลประจำตัว แต่เป็นการสร้างฟิลด์ประเภท "หมายเลขคำสั่งซื้อ"

กล่าวอีกนัยหนึ่งหมายเลขคำสั่งซื้อจะเปิดเผยต่อผู้ใช้ปลายทางและอาจมีกฎทางธุรกิจควบคู่ไปด้วย คุณต้องการให้ไม่ซ้ำกัน แต่การใช้ Identity Column ก็ไม่ถูกต้องเช่นกัน

ตัวอย่างเช่นประเภทคำสั่งซื้อที่แตกต่างกันอาจต้องใช้ลำดับที่แตกต่างกันดังนั้นคุณอาจมีลำดับสำหรับคำสั่งซื้อทางอินเทอร์เน็ตซึ่งตรงข้ามกับคำสั่งซื้อภายในองค์กร

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


1

เมื่อเร็ว ๆ นี้มีบางสิ่งที่ต้องพิจารณาสำหรับเอกลักษณ์เทียบกับลำดับ ดูเหมือนว่า MSFT จะแนะนำลำดับหากคุณอาจต้องการรักษาเอกลักษณ์โดยไม่มีช่องว่าง เรามีปัญหาที่มีช่องว่างขนาดใหญ่ในข้อมูลประจำตัว แต่จากคำสั่งนี้ที่เน้นจะอธิบายปัญหาของเราที่ SQL แคชข้อมูลประจำตัวและหลังจากรีบูตเราทำตัวเลขเหล่านั้นหายไป

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

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


1
มีคำตอบที่ดีว่าทำไมคุณถึงข้ามลิงก์IDENTITYตัวเลขและSEQUENCEมีปัญหาเดียวกันตามที่อธิบายไว้ที่นี่เชื่อมโยงแต่คุณสามารถ จำกัด โดยการตั้งค่าขนาดแคชมีขนาดเล็ก แต่มีแล้วมีการปิดด้วยความเร็ว
Mrphin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.