SQL Server 2012 เปิดตัวSequence
เป็นคุณลักษณะใหม่เช่นเดียวกับใน Oracle และ Postgres ลำดับไหนเป็นที่ต้องการมากกว่าอัตลักษณ์? และทำไมเราต้องมีลำดับ?
SQL Server 2012 เปิดตัวSequence
เป็นคุณลักษณะใหม่เช่นเดียวกับใน Oracle และ Postgres ลำดับไหนเป็นที่ต้องการมากกว่าอัตลักษณ์? และทำไมเราต้องมีลำดับ?
คำตอบ:
ฉันคิดว่าคุณจะพบคำตอบของคุณที่นี่
การใช้แอตทริบิวต์เอกลักษณ์สำหรับคอลัมน์คุณสามารถสร้างตัวเลขที่เพิ่มขึ้นอัตโนมัติได้อย่างง่ายดาย (ซึ่งมักใช้เป็นคีย์หลัก) ด้วย 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
ลำดับและเอกลักษณ์ที่ใช้ในการสร้างหมายเลขอัตโนมัติ แต่ข้อแตกต่างที่สำคัญคือ Identity ขึ้นอยู่กับตารางและลำดับไม่ขึ้นอยู่กับตาราง
หากคุณมีสถานการณ์ที่คุณต้องรักษาหมายเลขอัตโนมัติไว้ทั่วโลก (ในหลาย ๆ ตาราง) นอกจากนี้คุณต้องรีสตาร์ทช่วงเวลาของคุณหลังจากหมายเลขเฉพาะและคุณต้องแคชด้วยเพื่อประสิทธิภาพนี่คือสถานที่ที่เราต้องการลำดับไม่ใช่ เอกลักษณ์.
แม้ว่าลำดับจะให้ความยืดหยุ่นมากกว่าคอลัมน์ข้อมูลประจำตัว แต่ฉันไม่พบว่ามีประโยชน์ด้านประสิทธิภาพเลย
ฉันพบว่าประสิทธิภาพโดยใช้ข้อมูลประจำตัวเร็วกว่าการใช้ลำดับสำหรับการแทรกแบตช์อย่างต่อเนื่อง 3 เท่า
ฉันแทรกประมาณ 1.5 ล้านแถวและประสิทธิภาพคือ:
ฉันแทรกแถวลงในตารางซึ่งใช้วัตถุลำดับผ่านค่าเริ่มต้นของตาราง:
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
alter sequence increment by ...
เพียงแค่ทำให้มีที่ว่างสำหรับแถวใหม่ของคุณจากนั้นใช้ base + row_number () หรืออะไรก็ตามสำหรับค่าจริง
ฉันรู้ว่ามันเก่าไปหน่อย แต่อยากจะเพิ่มข้อสังเกตที่ทำให้ฉันรู้สึกแย่
ฉันเปลี่ยนจากเอกลักษณ์เป็นลำดับเพื่อให้ดัชนีของฉันเรียงตามลำดับ ฉันพบในภายหลังว่าลำดับไม่ได้ถ่ายโอนด้วยการจำลองแบบ ฉันเริ่มได้รับการละเมิดที่สำคัญหลังจากที่ฉันตั้งค่าการจำลองแบบระหว่างสองฐานข้อมูลเนื่องจากลำดับไม่ได้ซิงค์กัน เป็นเพียงสิ่งที่ต้องระวังก่อนตัดสินใจ
ฉันพบว่าการใช้ลำดับที่ดีที่สุดไม่ใช่การแทนที่คอลัมน์ข้อมูลประจำตัว แต่เป็นการสร้างฟิลด์ประเภท "หมายเลขคำสั่งซื้อ"
กล่าวอีกนัยหนึ่งหมายเลขคำสั่งซื้อจะเปิดเผยต่อผู้ใช้ปลายทางและอาจมีกฎทางธุรกิจควบคู่ไปด้วย คุณต้องการให้ไม่ซ้ำกัน แต่การใช้ Identity Column ก็ไม่ถูกต้องเช่นกัน
ตัวอย่างเช่นประเภทคำสั่งซื้อที่แตกต่างกันอาจต้องใช้ลำดับที่แตกต่างกันดังนั้นคุณอาจมีลำดับสำหรับคำสั่งซื้อทางอินเทอร์เน็ตซึ่งตรงข้ามกับคำสั่งซื้อภายในองค์กร
กล่าวอีกนัยหนึ่งอย่าคิดว่าลำดับเป็นเพียงการแทนที่ข้อมูลประจำตัวให้คิดว่าลำดับนั้นมีประโยชน์ในกรณีที่ข้อมูลประจำตัวไม่ตรงกับข้อกำหนดทางธุรกิจ
เมื่อเร็ว ๆ นี้มีบางสิ่งที่ต้องพิจารณาสำหรับเอกลักษณ์เทียบกับลำดับ ดูเหมือนว่า MSFT จะแนะนำลำดับหากคุณอาจต้องการรักษาเอกลักษณ์โดยไม่มีช่องว่าง เรามีปัญหาที่มีช่องว่างขนาดใหญ่ในข้อมูลประจำตัว แต่จากคำสั่งนี้ที่เน้นจะอธิบายปัญหาของเราที่ SQL แคชข้อมูลประจำตัวและหลังจากรีบูตเราทำตัวเลขเหล่านั้นหายไป
ค่าที่ต่อเนื่องกันหลังจากการรีสตาร์ทเซิร์ฟเวอร์หรือความล้มเหลวอื่น ๆ - SQL Server อาจแคชค่าข้อมูลประจำตัวด้วยเหตุผลด้านประสิทธิภาพและค่าที่กำหนดบางส่วนอาจสูญหายไประหว่างฐานข้อมูลล้มเหลวหรือรีสตาร์ทเซิร์ฟเวอร์ ซึ่งอาจทำให้เกิดช่องว่างในค่าเอกลักษณ์เมื่อใส่ หากไม่สามารถยอมรับช่องว่างได้แอปพลิเคชันควรใช้กลไกของตัวเองเพื่อสร้างค่าคีย์ การใช้ตัวสร้างลำดับกับอ็อพชัน NOCACHE สามารถ จำกัด ช่องว่างในการทำธุรกรรมที่ไม่เคยถูกผูกมัด