อะไรคือความแตกต่างระหว่างดัชนีแบบคลัสเตอร์และแบบไม่รวมกลุ่ม?


277

อะไรคือความแตกต่างระหว่าง a clusteredและ a non-clustered index?


8
คุณสามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตาราง แต่ก็ยังมีความอุดมสมบูรณ์ของความแตกต่างอื่น ๆ ...
ทอมโรบินสัน

5
ดัชนีคลัสเตอร์อธิบายจริง ๆ แล้วลำดับที่ระเบียนจะถูกจัดเก็บทางกายภาพบนดิสก์ดังนั้นเหตุผลที่คุณสามารถมีเพียงหนึ่ง ดัชนีที่ไม่ทำคลัสเตอร์จะกำหนดลำดับตรรกะที่ไม่ตรงกับคำสั่งทางกายภาพบนดิสก์
Josh

1
การทำคลัสเตอร์โดยทั่วไปหมายถึงข้อมูลอยู่ในลำดับฟิสคัลในตาราง นี่คือเหตุผลที่คุณสามารถมีเพียงหนึ่งต่อตาราง Unclustered หมายถึงมันเป็นคำสั่งแบบ "ตรรกะเท่านั้น"
Biri

2
@biri คำสั่ง "ตรรกะ" คืออะไร ดัชนีที่ไม่ใช่แบบคลัสเตอร์จะจัดเก็บคีย์ดัชนีตามลำดับทางกายภาพและจะจัดเก็บตัวชี้ไปยังตารางนั่นคือคีย์ดัชนีแบบคลัสเตอร์
สเตฟานีหน้า

@Stephanie Page: ตรรกะจากมุมมองตาราง แน่นอนว่าดัชนีที่ไม่ใช่แบบคลัสเตอร์นั้นจะมีการเรียงลำดับดัชนีทางกายภาพในตัวเอง
Biri

คำตอบ:


268

ดัชนีแบบคลัสเตอร์

  • เพียงหนึ่งต่อตาราง
  • อ่านได้เร็วกว่าที่ไม่ทำคลัสเตอร์เนื่องจากข้อมูลถูกจัดเก็บตามลำดับดัชนี

ดัชนีที่ไม่เป็นคลัสเตอร์

  • สามารถใช้งานได้หลายครั้งต่อโต๊ะ
  • เร็วกว่าสำหรับการแทรกและอัพเดตการดำเนินการกว่าดัชนีคลัสเตอร์

ดัชนีทั้งสองประเภทจะปรับปรุงประสิทธิภาพเมื่อเลือกข้อมูลด้วยเขตข้อมูลที่ใช้ดัชนี แต่จะชะลอการอัปเดตและแทรกการดำเนินการ

เนื่องจากการแทรกที่ช้าลงและการอัพเดตดัชนีคลัสเตอร์ควรถูกตั้งค่าบนฟิลด์ที่โดยปกติจะเพิ่มขึ้นเช่น Id หรือ Timestamp

โดยปกติแล้ว SQL Server จะใช้ดัชนีเท่านั้นหากค่าการเลือกสูงกว่า 95%


9
นอกจากนี้ยังมีข้อควรพิจารณาในการจัดเก็บ เมื่อแทรกแถวลงในตารางที่ไม่มีดัชนีคลัสเตอร์แถวจะถูกจัดเก็บย้อนหลังบนหน้าและการอัปเดตแถวอาจส่งผลให้แถวถูกย้ายไปยังจุดสิ้นสุดของตารางทำให้มีพื้นที่ว่างเหลืออยู่และแยกส่วนของตารางและดัชนี
Jeremiah Peschka

4
คุณไม่ต้องสนใจว่า x คืออะไร สิ่งที่คุณต้องรู้คือสำหรับแอปที่มีผู้ใช้หลายล้านคน x จะมีความสำคัญ
Pacerier

14
มันเป็นความเชื่อล้วนๆ ไม่ใช่ "เร็วกว่าในการอ่านเนื่องจากข้อมูลจะถูกจัดเก็บตามลำดับ" การอ่านเร็วกว่าเพราะคุณหลีกเลี่ยงการอ่านดัชนีและจากนั้นอ่านตาราง มันเร็วกว่าที่จะสแกนช่วง (ถ้ามีความหมาย) เพราะข้อมูลจะถูกเก็บไว้ในลำดับ นั่นคือปัจจัยการจัดกลุ่มที่สมบูรณ์แบบ
สเตฟานีหน้า

6
ความคิดที่ว่า 95% ของบันทึกต้องไม่ซ้ำกันคือการเข้าใจผิด สมมติว่าคุณมีตารางที่มี 1,000,000 แถวและคุณจัดทำดัชนีคอลัมน์ที่มี 500,000 คีย์ 0% ไม่ซ้ำกัน แต่แต่ละคีย์ส่งคืน 2 จากหนึ่งล้านแถว ดัชนีนี้มีประโยชน์อย่างยิ่งโดยไม่คำนึงว่า 0% ของระเบียนจะไม่ซ้ำกัน
สเตฟานีหน้า

2
"ข้อมูลถูกเก็บไว้ตามลำดับดัชนี" คุณหมายถึงอะไร ในระดับหนึ่งมันเป็นเรื่องจริงเล็กน้อยเพราะหน้าข้อมูลและหน้าดัชนีของหน้าเว็บนั้นเป็นหน้าเดียวและเหมือนกันดังนั้นการเรียงลำดับของหน้าหนึ่งจะอธิบายการเรียงลำดับของอีกหน้าหนึ่งอย่างชัดเจน อย่างไรก็ตามสิ่งนี้ไม่จำเป็นต้องอยู่ในลำดับใด ๆ เช่นคำสั่งของดัชนีคีย์stackoverflow.com/questions/1251636/ …
Martin Smith

79

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

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


3
'อย่างไรก็ตามหากคุณเลือกเฉพาะข้อมูลที่มีอยู่ในคอลัมน์ที่จัดทำดัชนีคุณสามารถรับข้อมูลกลับจากข้อมูลดัชนีที่ทำซ้ำได้โดยตรง' - ใช่นั่นเป็นข้อยกเว้นที่สำคัญสำหรับฮิวริสติกดัชนีแบบคลัสเตอร์ที่ชอบ ฉันเดาว่าในกรณีนี้คุณมีดัชนีคลัสเตอร์ แต่มีข้อมูลน้อยลงในตารางที่คุณทำการสืบค้นเพื่อให้สามารถอ่านดิสก์ได้เร็วขึ้น
satnhak

34

ดัชนีแบบคลัสเตอร์จะถูกเก็บไว้ในตาราง ซึ่งหมายความว่าพวกมันเร็วที่สุดและคุณสามารถมีดัชนีคลัสเตอร์เดียวได้หนึ่งตาราง

ดัชนีที่ไม่ใช่คลัสเตอร์จะถูกจัดเก็บแยกกันและคุณสามารถมีได้มากเท่าที่คุณต้องการ

ตัวเลือกที่ดีที่สุดคือการตั้งค่าดัชนีคลัสเตอร์ของคุณในคอลัมน์ที่ไม่ซ้ำกันที่ใช้มากที่สุดคือ PK คุณควรมีดัชนีคลัสเตอร์ที่ได้รับการคัดสรรมาเป็นอย่างดีในตารางของคุณเว้นแต่เหตุผลที่น่าสนใจมาก - ไม่สามารถนึกถึงดัชนีเดี่ยวได้


3
คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับ "เราควรมีดัชนีกลุ่มในตารางของเรา"? คำพูดนั้นผิดเพราะคำพูดเสมอ
Pacerier

1
คุณพูดถูก Pacerier ไม่ควรใช้งบเด็ดขาด แม้ว่าฉันจะไม่รู้กรณีเดียวเมื่อคุณไม่ควรมีดัชนีแบบคลัสเตอร์ที่เลือกได้ดี แต่กรณีดังกล่าวอาจมีอยู่ดังนั้นฉันจึงเปลี่ยนคำตอบเป็นรุ่นทั่วไปมากขึ้น
Santiago Cepas

28

ดัชนีแบบคลัสเตอร์

  1. สามารถมีดัชนีคลัสเตอร์เดียวได้หนึ่งตาราง
  2. มักจะทำในคีย์หลัก
  3. โหนดใบไม้ของดัชนีคลัสเตอร์มีหน้าข้อมูล

ดัชนีที่ไม่ทำคลัสเตอร์

  1. สามารถมีดัชนีที่ไม่ได้ทำคลัสเตอร์ได้เพียง 249 ตัวสำหรับตาราง (จนถึง sql version 2005 รุ่นที่ใหม่กว่ารองรับดัชนีที่ไม่ใช่คลัสเตอร์ได้ถึง 999)
  2. มักจะทำบนปุ่มใด ๆ
  3. โหนดลีฟของดัชนีที่ไม่ได้คลัสเตอร์จะไม่ประกอบด้วยหน้าข้อมูล โหนดใบไม้จะมีแถวดัชนีแทน

24

ดัชนีแบบคลัสเตอร์

  • ดัชนีคลัสเตอร์เดียวเท่านั้นที่สามารถมีในตาราง
  • เรียงลำดับระเบียนและจัดเก็บไว้ตามลำดับ
  • การดึงข้อมูลเร็วกว่าดัชนีที่ไม่ทำคลัสเตอร์
  • ไม่ต้องการพื้นที่เพิ่มเติมเพื่อจัดเก็บโครงสร้างแบบลอจิคัล

ดัชนีที่ไม่เป็นคลัสเตอร์

  • อาจมีดัชนีที่ไม่ได้ทำคลัสเตอร์จำนวนเท่าใดก็ได้ในตาราง
  • ไม่ส่งผลกระทบต่อลำดับทางกายภาพ สร้างลำดับตรรกะสำหรับแถวข้อมูลและใช้ตัวชี้ไปยังไฟล์ข้อมูลทางกายภาพ
  • การแทรก / อัปเดตข้อมูลเร็วกว่าดัชนีที่ทำคลัสเตอร์
  • ใช้พื้นที่เพิ่มเติมเพื่อจัดเก็บโครงสร้างแบบลอจิคัล

นอกเหนือจากความแตกต่างเหล่านี้คุณต้องรู้ว่าเมื่อตารางไม่มีการทำคลัสเตอร์ (เมื่อตารางไม่มีดัชนีแบบกลุ่ม) ไฟล์ข้อมูลจะไม่เรียงลำดับและจะใช้โครงสร้างข้อมูล Heap เป็นโครงสร้างข้อมูล


10

โดยทั่วไปในคลัสเตอร์หมายความว่าข้อมูลอยู่ในลำดับทางกายภาพในตาราง นี่คือเหตุผลที่คุณสามารถมีเพียงหนึ่งต่อตาราง

Unclustered หมายถึงมันเป็นคำสั่งแบบ "ตรรกะเท่านั้น"


9

ข้อดี:

ดัชนีแบบคลัสเตอร์ทำงานได้ดีสำหรับช่วง (เช่นเลือก * จาก my_table โดยที่ my_key ระหว่าง @min ถึง @max)

ในบางเงื่อนไข DBMS จะไม่ต้องทำการเรียงลำดับหากคุณใช้คำสั่ง orderby

จุดด้อย:

ดัชนีแบบกลุ่มสามารถทำให้เม็ดมีดช้าลงได้เนื่องจากต้องมีการปรับเปลี่ยนเค้าโครงทางกายภาพของเรคคอร์ดเนื่องจากมีการบันทึกเรคคอร์ดหากคีย์ใหม่ไม่เรียงตามลำดับ


6

ดัชนีคลัสเตอร์เป็นหลักคัดลอกเรียงลำดับของข้อมูลในคอลัมน์ดัชนี

ข้อได้เปรียบหลักของดัชนีคลัสเตอร์คือเมื่อแบบสอบถามของคุณ (ค้นหา) ค้นหาข้อมูลในดัชนีแล้วไม่จำเป็นต้องใช้ IO เพิ่มเติมในการดึงข้อมูลนั้น

ค่าใช้จ่ายในการบำรุงรักษาดัชนีคลัสเตอร์โดยเฉพาะอย่างยิ่งในตารางที่อัปเดตบ่อยครั้งอาจนำไปสู่ประสิทธิภาพที่ไม่ดีและด้วยเหตุนี้จึงอาจดีกว่าเพื่อสร้างดัชนีที่ไม่ใช่คลัสเตอร์


6

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

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

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


5

ดัชนีคลัสเตอร์อธิบายจริง ๆ แล้วลำดับที่เร็กคอร์ดที่เก็บทางกายภาพบนดิสก์ดังนั้นเหตุผลที่คุณสามารถมีเพียงหนึ่ง

ดัชนีที่ไม่ได้ทำคลัสเตอร์จะกำหนดลำดับตรรกะที่ไม่ตรงกับคำสั่งทางกายภาพบนดิสก์


2

คุณอาจผ่านส่วนของทฤษฎีจากบทความด้านบน:

- ดัชนีกลุ่มในขณะที่เราสามารถเห็นคะแนนโดยตรงในการบันทึกเช่นโดยตรงเพื่อใช้เวลาในการค้นหาน้อยลง นอกจากนี้จะไม่ใช้หน่วยความจำ / พื้นที่เพิ่มเติมเพื่อจัดเก็บดัชนี

- ในขณะที่ไม่ใช่กลุ่มดัชนีมันชี้ไปที่ดัชนีกลุ่มทางอ้อมแล้วมันจะเข้าถึงบันทึกที่เกิดขึ้นจริงเนื่องจากลักษณะทางอ้อมมันจะใช้เวลาในการเข้าถึงนอกจากนี้มันต้องการหน่วยความจำ / พื้นที่ในการจัดเก็บ ดัชนี

ป้อนคำอธิบายรูปภาพที่นี่


0

// คัดลอกมาจาก MSDN จุดที่สองของดัชนีที่ไม่ใช่คลัสเตอร์ไม่ได้กล่าวถึงอย่างชัดเจนในคำตอบอื่น ๆ

พัว

  • ดัชนีแบบกลุ่มจะเรียงลำดับและจัดเก็บแถวข้อมูลในตารางหรือมุมมองตามค่าคีย์ นี่คือคอลัมน์ที่รวมอยู่ในการกำหนดดัชนี สามารถมีดัชนีคลัสเตอร์ได้เพียงหนึ่งรายการต่อหนึ่งตารางเนื่องจากแถวข้อมูลสามารถจัดเก็บในลำดับเดียวได้
  • ครั้งเดียวที่แถวข้อมูลในตารางถูกจัดเก็บตามลำดับที่เรียงคือเมื่อตารางมีดัชนีคลัสเตอร์ เมื่อตารางมีดัชนีคลัสเตอร์ตารางจะเรียกว่าตารางคลัสเตอร์ หากตารางไม่มีดัชนีคลัสเตอร์แถวข้อมูลจะถูกเก็บไว้ในโครงสร้างที่ไม่เรียงลำดับที่เรียกว่าฮีป

nonclustered

  • ดัชนีที่ไม่ได้คลัสเตอร์จะมีโครงสร้างแยกจากแถวข้อมูล ดัชนีที่ไม่ใช่คลัสเตอร์จะมีค่าคีย์ดัชนีที่ไม่คลัสเตอร์และ
    แต่ละรายการค่าคีย์มีตัวชี้ไปยังแถวข้อมูลที่มีค่าคีย์
  • ตัวชี้จากแถวดัชนีในดัชนีที่ไม่คลัสเตอร์ไปยังแถวข้อมูลเรียกว่าตัวระบุแถว โครงสร้างของตัวระบุตำแหน่งแถวขึ้นอยู่กับว่าหน้าข้อมูลถูกเก็บไว้ในฮีปหรือตารางคลัสเตอร์ สำหรับ heap ตัวระบุตำแหน่งแถวเป็นตัวชี้ไปยังแถว สำหรับตารางคลัสเตอร์ locator แถวคือคีย์ดัชนีคลัสเตอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.