ฉันมีตาราง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%