'หลีกเลี่ยงการสร้างดัชนีแบบคลัสเตอร์โดยยึดตามคีย์ที่เพิ่มขึ้น' เป็นตำนานมาจาก SQL Server 2000 หรือไม่


22

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

การพัฒนาฐานข้อมูลเริ่มต้นขึ้นในยุคของ SQL Server 6.0

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

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

คำตอบ:


34

ตำนานกลับไปก่อนที่จะ SQL Server 6.5 ซึ่งเพิ่มล็อคระดับแถว และนัยที่นี่โดยเคเลนเดลานีย์

จะทำอย่างไรกับ "ฮอตสปอต" ของการใช้หน้าข้อมูลและข้อเท็จจริงที่ว่าหน้าเว็บขนาด 2k (SQL Server 7 และสูงกว่าใช้หน้า 8k) ถูกล็อคแทนที่จะเป็นแถวแทรก Edit, Feb 2012

พบบทความที่เชื่อถือได้โดย Kimberly L. Tripp

"การอภิปรายดัชนีกลุ่มยังคงดำเนินต่อไป ... "

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

แก้ไขพฤษภาคม 2013

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

ในระดับส่วนบุคคลฉันได้ปลุกฐานข้อมูลที่ฉันแทรกหมื่นแถวต่อวินาทีลงในตารางที่มีคอลัมน์ประจำตัวขนาดใหญ่เป็น PK แบบคลัสเตอร์


23

ในการสรุปรวมในรุ่นเซิร์ฟเวอร์ SQL ที่ทันสมัยคีย์คลัสเตอร์ในคอลัมน์ข้อมูลประจำตัวเป็นตัวเลือกที่ต้องการวันนี้


สั้นง่ายตรงประเด็นเพื่อให้ได้ +1 ของฉัน อย่าลืมลิงค์ไปยัง SQLSkills เนื่องจากมีข้อมูลที่ดีมากมาย
AndrewSQL

12
ฟังดูเหมือนคำสั่ง ไม่มีคำอธิบายหรือเหตุผลว่าทำไมเราควร ...
gbn

ไม่เพียง แต่ฟังดูเหมือนคำสั่งเท่านั้น แต่ยังผิด ฐานข้อมูลใด ๆ ที่มีจำนวนแทรก / วินาทีสูงมากจะพบปัญหาฮอตสปอตหากคุณใช้คีย์ตามลำดับ
Thomas Kejser

1
ฉันบอกว่าต้องการไม่จำเป็น สำหรับแอปพลิเคชันทั่วไปที่สร้างขึ้น 98% ของฐานข้อมูลในโลกคีย์คลัสเตอร์ในคอลัมน์ข้อมูลประจำตัวใช้งานได้ดี
mrdenny

10

Kimberly Tripp มีโพสต์บล็อกที่ยอดเยี่ยมเกี่ยวกับเพียงแค่หัวข้อนี้ ฉันสามารถถอดความได้ แต่เชื่อฉันฉันจะไม่ทำเรื่องความยุติธรรม ได้อ่าน http://www.sqlskills.com/BLOGS/KIMBERLY/post/Ever-increasing-clustering-key-the-Clustered-Index-Debateagain!.aspx

ในขณะนั้นให้ดูโพสต์อื่น ๆ ของเธอในหัวข้อของคีย์การทำคลัสเตอร์ มีความรู้ที่ดีมากมายจากไซต์ของเธอ


4

ตรวจสอบโพสต์นี้:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/monotonically-increasing-clustered-index-keys-can-cause-latch-contention.aspx

การสร้างดัชนีแบบคลัสเตอร์โดยใช้คีย์การเพิ่มอาจสร้างฮอตสปอตที่ไม่ดีต่อประสิทธิภาพ ...


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

@bernd_k: นี่เป็นลิงค์ตัวอย่างที่ไม่ดี ตารางลูกมีคีย์คลัสเตอร์ที่ไม่ซ้ำกันที่ไม่ดีซึ่งต้องใช้ตัวแปลงภายใน
gbn

1
ลองการทดลองนี้แล้ว: kejser.org/boosting-insert-speed-by-generating-scalable-keys
Thomas Kejser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.