ฉันมีตารางSQL Server 2014ที่มีลักษณะดังต่อไปนี้:
OrderId int not null IDENTITY --this is the primary key column
OrderDate datetime2 not null
CustomerId int not null
Description nvarchar(255) null
บางคนในทีมของฉันแนะนำว่าควรทำดัชนีคลัสเตอร์OrderId
แต่ฉันคิดว่าCustomerId
+ OrderId
จะเป็นตัวเลือกที่ดีกว่าด้วยเหตุผลต่อไปนี้:
- แบบสอบถามเกือบทั้งหมดจะมอง
WHERE CustomerId = @param
ไม่ใช่OrderId
CustomerId
เป็น foreign key ไปยังCustomer
ตารางดังนั้นการมีดัชนีคลัสเตอร์ที่CustomerId
ควรเพิ่มความเร็วในการรวม- แม้ว่า
CustomerId
จะไม่ซ้ำกันการมีOrderId
คอลัมน์เพิ่มเติมที่ระบุไว้ในดัชนีจะทำให้มั่นใจได้ว่าไม่ซ้ำกัน (เราสามารถใช้UNIQUE
คำหลักเมื่อสร้างดัชนีคลัสเตอร์ในคอลัมน์ 2 คอลัมน์เหล่านั้นเพื่อหลีกเลี่ยงค่าใช้จ่ายที่ไม่มีเอกลักษณ์) - เมื่อแทรกข้อมูลแล้ว
CustomerId
และOrderId
ไม่เปลี่ยนแปลงดังนั้นแถวเหล่านี้จะไม่ย้ายไปหลังจากการเขียนครั้งแรก - การเข้าถึงข้อมูลเกิดขึ้นผ่านทาง ORM ที่ร้องขอคอลัมน์ทั้งหมดตามค่าเริ่มต้นดังนั้นเมื่อมีการค้นหาตาม
CustomerId
มาดัชนีดัชนีคลัสเตอร์จะสามารถให้คอลัมน์ทั้งหมดโดยไม่ต้องทำงานเพิ่มเติมใด ๆ
ที่ไม่CustomerId
และOrderId
เสียงเช่นวิธีการเลือกที่ดีที่สุดที่กำหนดข้างต้น หรือเป็นOrderId
ของตัวเองดีกว่าเพราะมันเป็นคอลัมน์เดียวที่รับประกันความโดดเด่นด้วยตัวเอง?
ขณะนี้ตารางมีดัชนีคลัสเตอร์บนOrderId
และดัชนีที่CustomerId
ไม่ได้ทำคลัสเตอร์แต่มันไม่ครอบคลุมดังนั้นเนื่องจากเราใช้ ORM และมีการร้องขอคอลัมน์ทั้งหมดจึงเป็นงานพิเศษเพื่อดึงข้อมูลออกมา ดังนั้นเมื่อโพสต์นี้ฉันพยายามพิจารณาปรับปรุงประสิทธิภาพด้วย CI ที่ดีขึ้น
กิจกรรมในฐานข้อมูลของเรามีประมาณ 85% การอ่านและการเขียน 15%