อะไรคือความแตกต่างระหว่าง a clustered
และ a non-clustered index
?
อะไรคือความแตกต่างระหว่าง a clustered
และ a non-clustered index
?
คำตอบ:
ดัชนีแบบคลัสเตอร์
ดัชนีที่ไม่เป็นคลัสเตอร์
ดัชนีทั้งสองประเภทจะปรับปรุงประสิทธิภาพเมื่อเลือกข้อมูลด้วยเขตข้อมูลที่ใช้ดัชนี แต่จะชะลอการอัปเดตและแทรกการดำเนินการ
เนื่องจากการแทรกที่ช้าลงและการอัพเดตดัชนีคลัสเตอร์ควรถูกตั้งค่าบนฟิลด์ที่โดยปกติจะเพิ่มขึ้นเช่น Id หรือ Timestamp
โดยปกติแล้ว SQL Server จะใช้ดัชนีเท่านั้นหากค่าการเลือกสูงกว่า 95%
ดัชนีแบบคลัสเตอร์สั่งข้อมูลทางกายภาพบนดิสก์ ซึ่งหมายความว่าไม่ต้องการข้อมูลเพิ่มเติมสำหรับดัชนี แต่สามารถมีดัชนีคลัสเตอร์เดียวเท่านั้น (ชัด) การเข้าถึงข้อมูลโดยใช้ดัชนีคลัสเตอร์จะเร็วที่สุด
ดัชนีอื่น ๆ ทั้งหมดจะต้องไม่คลัสเตอร์ ดัชนีที่ไม่ใช่คลัสเตอร์มีข้อมูลที่ซ้ำกันจากคอลัมน์ดัชนีที่จัดเรียงไว้พร้อมกับตัวชี้ไปยังแถวข้อมูลจริง (ตัวชี้ไปยังดัชนีคลัสเตอร์หากมี) ซึ่งหมายความว่าการเข้าถึงข้อมูลผ่านดัชนีที่ไม่ทำคลัสเตอร์จะต้องผ่านชั้นทางอ้อมเพิ่มเติม อย่างไรก็ตามหากคุณเลือกเฉพาะข้อมูลที่มีอยู่ในคอลัมน์ที่จัดทำดัชนีคุณสามารถรับข้อมูลกลับโดยตรงจากข้อมูลดัชนีที่ทำซ้ำ (นั่นคือเหตุผลที่คุณควรเลือกเฉพาะคอลัมน์ที่คุณต้องการและไม่ใช้ *)
ดัชนีแบบคลัสเตอร์จะถูกเก็บไว้ในตาราง ซึ่งหมายความว่าพวกมันเร็วที่สุดและคุณสามารถมีดัชนีคลัสเตอร์เดียวได้หนึ่งตาราง
ดัชนีที่ไม่ใช่คลัสเตอร์จะถูกจัดเก็บแยกกันและคุณสามารถมีได้มากเท่าที่คุณต้องการ
ตัวเลือกที่ดีที่สุดคือการตั้งค่าดัชนีคลัสเตอร์ของคุณในคอลัมน์ที่ไม่ซ้ำกันที่ใช้มากที่สุดคือ PK คุณควรมีดัชนีคลัสเตอร์ที่ได้รับการคัดสรรมาเป็นอย่างดีในตารางของคุณเว้นแต่เหตุผลที่น่าสนใจมาก - ไม่สามารถนึกถึงดัชนีเดี่ยวได้
นอกเหนือจากความแตกต่างเหล่านี้คุณต้องรู้ว่าเมื่อตารางไม่มีการทำคลัสเตอร์ (เมื่อตารางไม่มีดัชนีแบบกลุ่ม) ไฟล์ข้อมูลจะไม่เรียงลำดับและจะใช้โครงสร้างข้อมูล Heap เป็นโครงสร้างข้อมูล
โดยทั่วไปในคลัสเตอร์หมายความว่าข้อมูลอยู่ในลำดับทางกายภาพในตาราง นี่คือเหตุผลที่คุณสามารถมีเพียงหนึ่งต่อตาราง
Unclustered หมายถึงมันเป็นคำสั่งแบบ "ตรรกะเท่านั้น"
ข้อดี:
ดัชนีแบบคลัสเตอร์ทำงานได้ดีสำหรับช่วง (เช่นเลือก * จาก my_table โดยที่ my_key ระหว่าง @min ถึง @max)
ในบางเงื่อนไข DBMS จะไม่ต้องทำการเรียงลำดับหากคุณใช้คำสั่ง orderby
จุดด้อย:
ดัชนีแบบกลุ่มสามารถทำให้เม็ดมีดช้าลงได้เนื่องจากต้องมีการปรับเปลี่ยนเค้าโครงทางกายภาพของเรคคอร์ดเนื่องจากมีการบันทึกเรคคอร์ดหากคีย์ใหม่ไม่เรียงตามลำดับ
ดัชนีคลัสเตอร์เป็นหลักคัดลอกเรียงลำดับของข้อมูลในคอลัมน์ดัชนี
ข้อได้เปรียบหลักของดัชนีคลัสเตอร์คือเมื่อแบบสอบถามของคุณ (ค้นหา) ค้นหาข้อมูลในดัชนีแล้วไม่จำเป็นต้องใช้ IO เพิ่มเติมในการดึงข้อมูลนั้น
ค่าใช้จ่ายในการบำรุงรักษาดัชนีคลัสเตอร์โดยเฉพาะอย่างยิ่งในตารางที่อัปเดตบ่อยครั้งอาจนำไปสู่ประสิทธิภาพที่ไม่ดีและด้วยเหตุนี้จึงอาจดีกว่าเพื่อสร้างดัชนีที่ไม่ใช่คลัสเตอร์
ฐานข้อมูลที่จัดทำดัชนีมีสองส่วนคือชุดของเร็กคอร์ดทางกายภาพซึ่งจัดเรียงตามลำดับโดยพลการและชุดของดัชนีที่ระบุลำดับที่ควรอ่านเร็กคอร์ดเพื่อให้ได้ผลลัพธ์ที่เรียงลำดับตามเกณฑ์บางอย่าง หากไม่มีความสัมพันธ์ระหว่างการจัดเรียงทางกายภาพและดัชนีดังนั้นการอ่านบันทึกทั้งหมดตามลำดับอาจจำเป็นต้องใช้การอ่านบันทึกเดียวแบบอิสระจำนวนมาก เนื่องจากฐานข้อมูลอาจสามารถอ่านระเบียนต่อเนื่องหลายสิบรายการในเวลาน้อยกว่าที่ใช้ในการอ่านระเบียนที่ไม่ต่อเนื่องสองรายการประสิทธิภาพอาจได้รับการปรับปรุงถ้าระเบียนที่ต่อเนื่องกันในดัชนีถูกเก็บไว้อย่างต่อเนื่องบนดิสก์
ตัวอย่างเช่นหากต้องเริ่มต้นด้วยฐานข้อมูลที่ไม่ใช่คลัสเตอร์และเพิ่ม 10,000 เรคคอร์ดในลำดับแบบสุ่มเร็กคอร์ดจะถูกเพิ่มในตอนท้ายตามลำดับที่เพิ่มเข้ามา การอ่านฐานข้อมูลตามดัชนีจะต้องอ่าน 10,000 เรคคอร์ดหนึ่งรายการ หากมีการใช้ฐานข้อมูลคลัสเตอร์ระบบอาจตรวจสอบเมื่อเพิ่มแต่ละระเบียนว่าบันทึกก่อนหน้านี้ถูกจัดเก็บด้วยตัวเอง; หากพบว่าเป็นกรณีดังกล่าวมันอาจเขียนเร็กคอร์ดนั้นด้วยเร็กคอร์ดใหม่ที่ส่วนท้ายของฐานข้อมูล จากนั้นจะสามารถดูระเบียนทางกายภาพก่อนช่องที่มีการย้ายระเบียนที่ใช้เพื่ออยู่และดูว่าระเบียนที่ตามมานั้นถูกเก็บไว้ด้วยตัวเองหรือไม่ หากพบว่าเป็นกรณีดังกล่าวก็สามารถย้ายระเบียนนั้นไปยังจุดที่ การใช้วิธีการเรียงลำดับนี้จะทำให้หลายระเบียนถูกจัดกลุ่มเข้าด้วยกันเป็นคู่
ในความเป็นจริงฐานข้อมูลแบบคลัสเตอร์ใช้อัลกอริทึมที่ซับซ้อนกว่านี้ สิ่งสำคัญที่ควรทราบคือว่ามีการแลกเปลี่ยนระหว่างเวลาที่จำเป็นในการปรับปรุงฐานข้อมูลและเวลาที่จำเป็นในการอ่านตามลำดับ การรักษาฐานข้อมูลแบบคลัสเตอร์จะเพิ่มปริมาณงานที่จำเป็นในการเพิ่มลบหรืออัปเดตระเบียนอย่างมากในลักษณะที่จะมีผลต่อลำดับการเรียงลำดับ หากฐานข้อมูลจะถูกอ่านตามลำดับบ่อยครั้งกว่าที่จะมีการอัพเดทการจัดกลุ่มอาจเป็นชัยชนะครั้งใหญ่ ถ้ามันจะได้รับการปรับปรุงบ่อยครั้ง แต่ไม่ค่อยอ่านในลำดับการทำคลัสเตอร์อาจเป็นตัวระบายประสิทธิภาพที่ยิ่งใหญ่โดยเฉพาะอย่างยิ่งถ้าลำดับที่ไอเท็มถูกเพิ่มลงในฐานข้อมูลนั้นไม่ขึ้นอยู่กับลำดับการจัดเรียงตามดัชนีคลัสเตอร์
ดัชนีคลัสเตอร์อธิบายจริง ๆ แล้วลำดับที่เร็กคอร์ดที่เก็บทางกายภาพบนดิสก์ดังนั้นเหตุผลที่คุณสามารถมีเพียงหนึ่ง
ดัชนีที่ไม่ได้ทำคลัสเตอร์จะกำหนดลำดับตรรกะที่ไม่ตรงกับคำสั่งทางกายภาพบนดิสก์
คุณอาจผ่านส่วนของทฤษฎีจากบทความด้านบน:
- ดัชนีกลุ่มในขณะที่เราสามารถเห็นคะแนนโดยตรงในการบันทึกเช่นโดยตรงเพื่อใช้เวลาในการค้นหาน้อยลง นอกจากนี้จะไม่ใช้หน่วยความจำ / พื้นที่เพิ่มเติมเพื่อจัดเก็บดัชนี
- ในขณะที่ไม่ใช่กลุ่มดัชนีมันชี้ไปที่ดัชนีกลุ่มทางอ้อมแล้วมันจะเข้าถึงบันทึกที่เกิดขึ้นจริงเนื่องจากลักษณะทางอ้อมมันจะใช้เวลาในการเข้าถึงนอกจากนี้มันต้องการหน่วยความจำ / พื้นที่ในการจัดเก็บ ดัชนี
// คัดลอกมาจาก MSDN จุดที่สองของดัชนีที่ไม่ใช่คลัสเตอร์ไม่ได้กล่าวถึงอย่างชัดเจนในคำตอบอื่น ๆ
พัว
nonclustered