ที่จริงแล้วคุณไม่จำเป็นต้องสร้างดัชนีแบบกลุ่มหรือคีย์หลักเพื่อสร้างเนื่องจากดัชนีที่ไม่ซ้ำและดัชนีที่ไม่ซ้ำสามารถจัดการงานได้ SQL Server ได้สนับสนุนดัชนีแบบกลุ่มตั้งแต่อย่างน้อยเวอร์ชัน 1.1 แต่คีย์หลักเป็นเพียง "แนวคิด" ที่โปรแกรมเมอร์บังคับใช้โดยการกำหนดดัชนีเฉพาะ
แต่ดูเหมือนว่าทั้งคีย์หลักและดัชนีแบบคลัสเตอร์เป็นแนวคิดที่มีคุณค่าในฐานข้อมูลส่วนใหญ่
ให้เราดูที่เอกสารเซิร์ฟเวอร์ SQL เพื่อดูคำอธิบายบางส่วนของตัวเลือกการจัดทำดัชนีบางอย่างที่แสดงด้านล่าง
ดัชนีแบบคลัสเตอร์: https://msdn.microsoft.com/en-us/library/ms190457.aspx
- ดัชนีแบบกลุ่มจะเรียงลำดับและจัดเก็บแถวข้อมูลในตารางหรือมุมมองตามค่าคีย์ นี่คือคอลัมน์ที่รวมอยู่ในคำจำกัดความของดัชนี
- สามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตาราง
คีย์หลัก: https://msdn.microsoft.com/en-us/library/ms190457.aspx
ตารางสามารถมีข้อ จำกัด หลักของคีย์เดียวเท่านั้น
คอลัมน์ทั้งหมดที่กำหนดไว้ภายในข้อ จำกัด หลักของคีย์จะต้องกำหนดเป็น NOT NULL
คีย์หลักสามารถสร้างเป็นดัชนีแบบคลัสเตอร์ (ค่าเริ่มต้นหากไม่มีดัชนีแบบคลัสเตอร์) หรือดัชนีแบบไม่เป็นกลุ่ม
ดัชนีที่ไม่ซ้ำ: https://msdn.microsoft.com/en-us/library/ms187019.aspx
เมื่อคุณสร้างข้อ จำกัด UNIQUE ดัชนี nonclustered ที่ไม่ซ้ำกันจะถูกสร้างขึ้นเพื่อบังคับใช้ข้อ จำกัด UNIQUE โดยค่าเริ่มต้น
คุณสามารถระบุ UNIQUE Clustered Index ได้หากไม่มี Clustered Index อยู่แล้วสำหรับตาราง
ซึ่งหมายความว่าคำถามของคุณเกี่ยวกับดัชนีแบบคลัสเตอร์และคีย์หลักนั้นเกี่ยวกับปัญหาต่อไปนี้ โปรดทราบว่าไม่ใช่ทุกตารางจะได้ประโยชน์จากแผนการจัดทำดัชนีเดียวกัน
เมื่อใดที่ฉันจะได้รับประโยชน์จากคีย์หลักที่ถูกแยกออกจากดัชนีแบบกลุ่ม
บางทีเมื่อดัชนีแบบกลุ่มเป็นแบบกว้าง (ตัวอย่างเช่น 5 คอลัมน์ของข้อมูลแบบข้อความ แต่คีย์หลักมีขนาดเล็ก (INT หรือ BIGINT) เช่นคุณดูเหมือนจะอธิบาย
- ดัชนีแบบคลัสเตอร์แบบกว้างจะอนุญาตให้คุณเลือกแถวจากดัชนีอย่างรวดเร็วสำหรับชุดย่อยของแบบสอบถามที่ให้คำตอบแบบอนุกรมจากดัชนีแบบคลัสเตอร์ (หรือที่เรียกว่าตาราง ) ตัวอย่างเช่นดัชนี 5 คอลัมน์แบบคลัสเตอร์จะรองรับการสแกนคอลัมน์ C1, C2, C3, C4, C5 หรือ C1, C2, C3, C4 และอื่น ๆ ลงไปที่ C1
- หมายเหตุ: หากแถวมีขนาดใหญ่อาจทำให้คุณได้รับผลประโยชน์ด้านความเร็วในการเลือกชุดอนุกรมของแถวโดยเฉพาะถ้าคอลัมน์อื่น ๆ ในตารางรวมอยู่ในชุดผลลัพธ์เป็นประจำ
- ในกรณีนั้นคุณสามารถใช้คีย์หลักสำหรับการอ้างอิงที่สมบูรณ์เพื่อระบุค่าที่ต้องการเป็นคีย์ต่างประเทศเพื่อ จำกัด แถวในตารางอื่น ๆ PK มีขนาดเล็กและดังนั้น FK จึงมีผลกระทบเล็กน้อยกับขนาดของตารางอ้างอิง
- อย่างไรก็ตามโปรดทราบว่าดัชนีใด ๆ ที่สร้างขึ้นในตารางที่มีดัชนีแบบกลุ่มจะรวมคอลัมน์คลัสเตอร์ทั้งหมดในดัชนีอื่น ๆ ที่คุณสร้างในตารางนี้ ดัชนีแบบคลัสเตอร์แบบกว้างจะขยายขนาดของดัชนีที่ไม่ใช่แบบคลัสเตอร์ทั้งหมดบนตารางนั้น
คุณควรสร้างคีย์หลักเพียงอย่างเดียวเพื่อเป็นดัชนีแบบกลุ่มหรือไม่
หากคุณมีคีย์หลักขนาดเล็ก (INT หรือ BIGINT) และเป็นดัชนีแบบกลุ่มค่าใช้จ่ายของคอลัมน์คลัสเตอร์จะค่อนข้างเล็ก แม้ว่าคีย์หลักแบบคลัสเตอร์ในกรณีนี้จะมีอยู่ในทุกดัชนีในตารางนี้ แต่จะมีค่าใช้จ่ายน้อยกว่า Wide Wide ที่กล่าวถึงข้างต้น
ดัชนีคีย์หลักกลุ่มนี้มักจะไม่นำเสนอเส้นทางที่ง่ายต่อการเลือกหลายแถวตามลำดับ
ตอนนี้คุณได้สร้างคีย์หลักแบบคลัสเตอร์แล้วคอลัมน์อื่น ๆ ที่คุณเคยวางแผนที่จะรวมไว้ในดัชนีแบบกลุ่มเป็นอย่างไร
สร้างดัชนีที่ไม่ซ้ำ (หรือไม่ซ้ำ) ตามต้องการเพื่อทำดัชนีเกณฑ์การค้นหาแบบกว้างของคอลัมน์ C1, C2, C3, C4, C5 ค่าในดัชนี“ การเลียนแบบกลุ่ม” นี้สามารถใช้เป็นเส้นทางการค้นหาที่รวดเร็วขึ้นสำหรับ 5 คอลัมน์เหล่านั้น INCLUDE (Doctor_Name, Diagnosis_Synopsis)
หากมีคอลัมน์ที่ไม่ใช่การจัดทำดัชนีหรือสองที่ได้รับการคัดเลือกเป็นประจำเช่นกันพวกเขาสามารถรวมอยู่ในดัชนีด้วย
แม้ว่าฉันจะพบว่าดัชนีแบบคลัสเตอร์และคีย์หลักที่เป็นประโยชน์มีเหตุผลที่ดีบางอย่างสำหรับการคิดว่าจะใช้ในตารางหรือในฐานข้อมูล
คุณต้องการดัชนีแบบกลุ่มหรือไม่?
หากคุณสร้างดัชนี (ดัชนีที่ไม่ซ้ำและดัชนีที่ไม่ซ้ำ) และกำหนดคีย์หลักโดยไม่มีค่าใช้จ่ายในการเป็นดัชนีแบบกลุ่มคุณอาจพบว่าดัชนีที่แคบลงนั้นให้สิ่งที่คุณต้องการสำหรับการสืบค้นของคุณ
มีพฤติกรรมที่มีประโยชน์บางอย่างในดัชนีแบบคลัสเตอร์และคีย์หลัก แต่โปรดจำไว้ว่ามันเป็นดัชนีที่สำคัญที่สุด ออกแบบกลยุทธ์การจัดทำดัชนีเพื่อคำนึงถึงความเป็นจริงของแอปพลิเคชันของคุณ บางทีOneBigTable
ความต้องการที่จะมีกลยุทธ์การจัดทำดัชนีที่แตกต่างจากสิ่งที่คุณใช้สำหรับตารางส่วนใหญ่
หากไม่มีดัชนีแบบกลุ่มข้อมูลของคุณจะถูกจัดเก็บเป็นฮีปพร้อมตัวระบุแถว (RID) ซึ่งไม่ใช่กลไกการค้นหาที่ดีเลย แต่ตามที่กล่าวไว้ก่อนหน้านี้คุณสามารถสร้างดัชนีที่ไม่ซ้ำกันและไม่ซ้ำกันเพื่อจัดการคิวรีของคุณ
ซึ่งตอนนี้จะนำคุณไปสู่การพิจารณากอง:
ฮีปและดัชนี: https://msdn.microsoft.com/en-us/library/hh213609.aspx
- เมื่อตารางถูกเก็บเป็นฮีปแต่ละแถวจะถูกระบุโดยการอ้างอิงถึงตัวระบุแถว (RID) ซึ่งประกอบด้วยหมายเลขไฟล์หมายเลขหน้าข้อมูลและสล็อตในหน้า id ของแถวเป็นโครงสร้างขนาดเล็กและมีประสิทธิภาพ (แต่ไม่ใช่ดัชนี )
- บางครั้งสถาปนิกข้อมูลที่ใช้กองเมื่อข้อมูลที่สามารถเข้าถึงได้เสมอผ่านดัชนี nonclustered และกรมชลประทานมีขนาดเล็กกว่าคีย์ดัชนีคลัสเตอร์
แต่ถ้าคุณมี 'ฮอตสปอต' ในชุดข้อมูลขนาดใหญ่คุณสามารถดูดัชนีประเภทอื่นได้ด้วย:
ดัชนีที่กรอง: https://msdn.microsoft.com/en-us/library/cc280372.aspx
ดัชนีตัวกรองที่ได้รับการออกแบบมาอย่างดีจะช่วยปรับปรุงประสิทธิภาพการค้นหาและคุณภาพของแผนปฏิบัติการเนื่องจากมีขนาดเล็กกว่าดัชนีแบบไม่เต็มตารางและมีการกรองสถิติ สถิติกรองมีความถูกต้องมากกว่าสถิติแบบเต็มรูปแบบตารางเพราะพวกเขาครอบคลุมเฉพาะแถวในดัชนีกรองที่
ดัชนีที่กรองมีจำนวนข้อ จำกัด ที่ระบุไว้ในลิงค์ไปยังดัชนีที่ถูกกรอง
อย่างไรก็ตามหากคุณสนใจที่จะคิดว่ามีความเป็นไปได้ที่จะข้ามคีย์หลักและดัชนีแบบกลุ่มไปด้วยกันคุณอาจอ่านโพสต์ของ Markus Winand ด้านล่าง เขาแสดงเหตุผลของเขาพร้อมกับตัวอย่างรหัสบางอย่างเพื่อแนะนำว่ามันอาจเป็นความคิดที่ดีในบางครั้งที่จะสละการใช้คุณลักษณะเหล่านั้น
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
แต่ในที่สุดมันก็กลับมาที่การทำความเข้าใจแอปพลิเคชันของคุณและออกแบบรหัสตารางดัชนีและอื่น ๆ เพื่อให้เหมาะกับงานที่คุณกำลังทำ