ดัชนีแบบคลัสเตอร์และไม่ใช่แบบคลัสเตอร์หมายถึงอะไรจริง ๆ


1118

ฉันมีฐานข้อมูลที่ จำกัด กับ DB และใช้ DB เป็นแอปพลิเคชันโปรแกรมเมอร์เท่านั้น ผมอยากจะทราบเกี่ยวกับและClustered Non clustered indexesฉัน googled และสิ่งที่ฉันพบคือ:

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

สิ่งที่ฉันพบใน SO คืออะไรความแตกต่างระหว่างดัชนีแบบคลัสเตอร์และแบบไม่รวมกลุ่มคืออะไร .

มีคนอธิบายเรื่องนี้เป็นภาษาอังกฤษธรรมดาได้ไหม

คำตอบ:


1116

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

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

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

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


43
คุณควรอธิบายความหมายของคำว่า "ร่างกาย"
# # # # รูปีสเปนเซอร์รูปี

142
ทางกายภาพเช่นเดียวกับบิตที่เกิดขึ้นจริงที่เก็บไว้ในดิสก์
Peter

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

46
@ สัตว์เลี้ยงที่ไม่เป็นเช่นนั้น SQL Server ไม่รับประกันว่าไฟล์ข้อมูลทั้งหมดจะถูกวางในพื้นที่ทางกายภาพของแผ่นดิสก์และไม่มีการแตกแฟรกเมนต์ของระบบไฟล์เป็นศูนย์ ไม่เป็นความจริงเลยที่ดัชนีคลัสเตอร์จะอยู่ในไฟล์ข้อมูล ระดับซึ่งไม่ใช่ในกรณีนี้คือระดับของการแตกแฟรกเมนต์เชิงตรรกะ
Martin Smith

42
เพียงแค่ความคิดเห็นอย่างรวดเร็วเพื่อสำรองจุดของ Martin Smith - ดัชนีกลุ่มไม่รับประกันการจัดเก็บตามลำดับบนดิสก์ การจัดการตำแหน่งที่ข้อมูลถูกวางไว้บนดิสก์เป็นหน้าที่ของระบบปฏิบัติการไม่ใช่ DBMS แต่มันแสดงให้เห็นว่ารายการที่มีการสั่งซื้อโดยทั่วไปตามคีย์การจัดกลุ่ม สิ่งนี้หมายความว่าถ้าฐานข้อมูลเพิ่มขึ้น 10GB ระบบปฏิบัติการอาจตัดสินใจใส่ 10GB นั้นเป็นชิ้นขนาด 5x2GB ในส่วนต่าง ๆ ของดิสก์ ตารางคลัสเตอร์ที่ครอบคลุม 10GB จะถูกจัดเก็บตามลำดับบนก้อนขนาด 2GB แต่ละอันกลุ่มก้อน 2GB นั้นอาจไม่เรียงตามลำดับ
blobbles

601

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

ตัวอย่างเช่นคุณมีสองตารางลูกค้าและคำสั่งซื้อ:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

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

ป.ล. ดัชนีบน CustomerID จะไม่ซ้ำกันอย่างชัดเจนดังนั้นคุณต้องเพิ่มเขตข้อมูลที่สองในการ "uniquify" ดัชนีหรือให้ฐานข้อมูลจัดการกับคุณ แต่นั่นเป็นอีกเรื่องหนึ่ง

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


4
ที่ถูกกล่าว CI ควรใช้เสมอสำหรับ PK
mko

4
ดังนั้นด้วยดัชนีคลัสเตอร์มันคือระเบียนในดัชนีหรือตารางที่จัดเก็บไว้ใกล้กันไหม
Caltor

5
@Caltor ตาราง ดัชนีเรียงตามคำจำกัดความ ตัวอย่างเช่น btree จะได้รับคำสั่งเพื่อให้สามารถทำการคำนวณทางคณิตศาสตร์เพื่อค้นหา แนวคิดของคลัสเตอร์คือการจัดเตรียมตารางเพื่อประสิทธิภาพของดัชนีเฉพาะ ต้องมีความชัดเจนระเบียนของตารางจะได้รับการจัดลำดับใหม่เพื่อให้ตรงกับคำสั่งซื้อที่ดัชนีอยู่ในขั้นต้น
FLGMwt

9
@Caltor ไม่เลย! แน่นอนเอกสารและชื่อตัวเองค่อนข้างเข้าใจผิด การมี "ดัชนีคลัสเตอร์" มีความเกี่ยวข้องกับดัชนีน้อยมาก แนวคิดสิ่งที่คุณมีคือ "ตารางคลัสเตอร์บนดัชนีx "
FLGMwt

3
@ JohnOrtizOrdoñez: แน่นอนว่าคุณสามารถใช้เกือบทุกที่ที่จัดเก็บไว้ในแถวจึงไม่มีXML, หรือVARCHAR(MAX) VARBINARY(MAX)โปรดทราบว่าโดยปกติแล้วจะมีเหตุผลที่จะทำคลัสเตอร์ในฟิลด์วันที่ก่อนเนื่องจากดัชนีคลัสเตอร์จะมีประสิทธิภาพมากที่สุดสำหรับการสแกนแบบช่วงซึ่งโดยทั่วไปจะเป็นประเภทวันที่ YMMV

317

ในหน่วยเก็บข้อมูลเชิงแถวของ SQL Server ดัชนีทั้งแบบคลัสเตอร์และแบบไม่รวมกลุ่มถูกจัดเป็นแผนผัง B

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

( แหล่งรูปภาพ )

ความแตกต่างที่สำคัญระหว่างดัชนีคลัสเตอร์และดัชนีที่ไม่ใช่คลัสเตอร์คือระดับลีฟของดัชนีคลัสเตอร์คือตาราง สิ่งนี้มีสองนัย

  1. แถวบนหน้าดัชนีจุดคลัสเตอร์จะมีบางสิ่งบางอย่างสำหรับแต่ละคอลัมน์ (ไม่กระจาย) ในตาราง (ทั้งค่าหรือตัวชี้ไปยังค่าจริง)
  2. ดัชนีคลัสเตอร์เป็นสำเนาหลักของตาราง

ดัชนีที่ไม่ใช่คลัสเตอร์สามารถทำชี้ที่ 1 ได้โดยใช้INCLUDEส่วน (ตั้งแต่ SQL Server 2005) เพื่อรวมคอลัมน์ที่ไม่ใช่คีย์ทั้งหมดไว้อย่างชัดเจน แต่เป็นดัชนีรองและมีสำเนาอีกรอบของข้อมูลอยู่เสมอ (ตารางตัวเอง)

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

ดัชนีทั้งสองด้านบนจะเหมือนกันเกือบทั้งหมด ด้วยหน้าดัชนีระดับบนที่มีค่าสำหรับคอลัมน์สำคัญA,Bและหน้าระดับใบที่มีA,B,C,D

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

ข้อความข้างต้นจาก SQL Server หนังสือออนไลน์ทำให้เกิดความสับสนมาก

ในความคิดของฉันมันจะเป็นวลีที่ดีกว่ามาก

สามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตารางเนื่องจากแถวระดับลีฟของดัชนีคลัสเตอร์เป็นแถวของตาราง

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

นี่จะเป็นการใช้งานที่ไร้สาระ ตัวอย่างเช่นหากมีการแทรกแถวลงในตารางกลางของ 4GB เซิร์ฟเวอร์ SQL ไม่จำเป็นต้องคัดลอกข้อมูล 2GB ขึ้นในไฟล์เพื่อให้มีที่ว่างสำหรับแถวที่แทรกใหม่

การแบ่งหน้าเกิดขึ้นแทน แต่ละหน้าที่ระดับลีฟของดัชนีทั้งคลัสเตอร์และไม่ใช่คลัสเตอร์มีที่อยู่ ( File:Page) ของหน้าถัดไปและก่อนหน้าในลำดับคีย์แบบโลจิคัล หน้าเหล่านี้ไม่จำเป็นต้องต่อเนื่องกันหรือเรียงตามลำดับความสำคัญ

เช่นกลุ่มเพจที่เชื่อมโยงอาจเป็น 1:2000 <-> 1:157 <-> 1:7053

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

ระดับที่ลำดับเชิงตรรกะและความแตกต่างจากเวอร์ชันทางกายภาพในอุดมคติคือระดับของการแตกแฟรกเมนต์เชิงตรรกะ

ในฐานข้อมูลที่สร้างขึ้นใหม่ด้วยไฟล์เดียวฉันวิ่งต่อไปนี้

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

จากนั้นตรวจสอบเค้าโครงหน้าด้วย

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

ผลลัพธ์ได้ทั่วทุกสถานที่ แถวแรกในการสั่งซื้อคีย์ (ที่มีค่า 1 - เน้นด้วยลูกศรด้านล่าง) อยู่ในเกือบหน้าทางกายภาพสุดท้าย

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

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

หลังจากวิ่ง

ALTER INDEX ix ON T REBUILD;

ฉันได้รับดังต่อไปนี้

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

หากตารางไม่มีดัชนีคลัสเตอร์จะเรียกว่าฮีป

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

สำหรับกรณีหลังหากดัชนีที่ไม่ได้ทำคลัสเตอร์รวมถึงคอลัมน์คีย์ CI ตามธรรมชาติแล้วไม่ว่าจะเป็นคอลัมน์คีย์ NCI หรือINCLUDEคอลัมน์ -d ดังนั้นจะไม่มีการเพิ่มอะไรเลย มิฉะนั้นคอลัมน์คีย์ CI ที่หายไปจะถูกเพิ่มเข้าใน NCI อย่างเงียบ ๆ

SQL Server จะตรวจสอบให้แน่ใจเสมอว่าคอลัมน์คีย์นั้นไม่ซ้ำกันสำหรับดัชนีทั้งสองประเภท กลไกที่สิ่งนี้ถูกบังคับใช้สำหรับดัชนีที่ไม่ได้ประกาศว่าไม่เหมือนกันแตกต่างกันระหว่างดัชนีทั้งสองชนิด

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

สำหรับดัชนีที่ไม่ใช่คลัสเตอร์ไม่ได้ประกาศว่าเป็น SQL Server ที่ไม่ซ้ำกันจะเพิ่มตัวระบุแถวเข้าไปในคีย์ดัชนีที่ไม่ใช่คลัสเตอร์ สิ่งนี้ใช้ได้กับทุกแถวไม่ใช่เฉพาะแถวที่ซ้ำกันจริงๆ

ระบบการตั้งชื่อแบบเทียบกับแบบไม่ทำคลัสเตอร์ยังใช้สำหรับดัชนีที่จัดเก็บคอลัมน์ กระดาษการปรับปรุงสถานะร้านค้าคอลัมน์เซิร์ฟเวอร์ SQL

แม้ว่าข้อมูลที่จัดเก็บคอลัมน์ไม่ได้ "คลัสเตอร์" จริง ๆ ในคีย์ใด ๆ เราตัดสินใจที่จะเก็บแบบแผน SQL Server แบบดั้งเดิมไว้เพื่ออ้างอิงถึงดัชนีหลักเป็นดัชนีแบบคลัสเตอร์


8
@brainstorm ใช่ฉันรู้แล้ว อาจเป็นเพราะการใช้ถ้อยคำในหน้า MSDN นี้แต่เพื่อดูว่าการใช้ถ้อยคำมีความเข้าใจผิดค่อนข้างคุณเพียงแค่ต้องดูหัวข้อการกระจายตัว
Martin Smith

12
@brainstorm: เป็นเรื่องที่น่าประหลาดใจที่มีการกล่าวเท็จซ้ำ ๆ ในพระกิตติคุณ กลุ่มบ่งชี้ว่าอย่างน้อยจากมุมมองของการอ่านตามลำดับมันจะเป็น "ที่พึงประสงค์" ที่จะมีแถวที่จัดเก็บทางกายภาพบนดิสก์ในลำดับเดียวกับดัชนีแต่นั่นเป็นหนทางไกลจากการบอกว่ามันจะทำให้พวกเขาจริง เก็บไว้ในแบบดังกล่าว
supercat

5
@MartinSmith ฉันได้ทำซ้ำและยืนยันผลการทดสอบของคุณSQL Server 2014แล้ว ฉันได้รับการ95%กระจายตัวของดัชนีหลังจากการแทรกครั้งแรก หลังจากindex rebuildการกระจายตัวของมัน0%และค่าถูกสั่ง ฉันสงสัยเราสามารถพูดได้The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0ไหม
gotqn

8
@MartinSmith ทีนี้นี่คือคำตอบ ฉันชอบที่จะเห็นมันด้านบนของรายการคำตอบ แต่เป็นไปดังนั้น "ง่ายและรวดเร็ว" ได้รับ upvoting
vaitrafra

5
@Manachi คำตอบนี้ได้รับ 5 ปีหลังจากถามคำถามเดิม จุดประสงค์ของมันคือเพื่อแก้ไขบางแง่มุมที่ทำให้เข้าใจผิดของคำตอบเหล่านั้น (ตอนนี้อายุ 8 ปี) การแปรปรวนของ OP ไม่ได้เป็นความกังวลของฉัน ผู้อ่านคนอื่นอาจชื่นชมมุมมองระดับต่ำ
Martin Smith

150

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ฉันคิดว่าฉันจะเสนอการเปรียบเทียบเพื่อช่วยอธิบายคำตอบที่ดีข้างต้น

ดัชนีกลุ่มข้อมูล

หากคุณเดินเข้าไปในห้องสมุดสาธารณะคุณจะพบว่าหนังสือมีการจัดเรียงตามลำดับเฉพาะ (น่าจะเป็นระบบทศนิยมดิวอี้หรือ DDS) สิ่งนี้สอดคล้องกับ"ดัชนีคลัสเตอร์"ของหนังสือ หาก DDS # สำหรับหนังสือที่คุณต้องการ005.7565 F736sคุณจะเริ่มต้นด้วยการค้นหาแถวของชั้นหนังสือที่มีป้ายกำกับ001-099หรือสิ่งที่คล้ายกัน (เครื่องหมาย endcap นี้ที่ส่วนท้ายของสแต็กสอดคล้องกับ "โหนดกลาง" ในดัชนี) ในที่สุดคุณจะเจาะลึกลงไปถึงชั้นวางที่ระบุเฉพาะ005.7450 - 005.7600จากนั้นคุณจะสแกนจนกว่าคุณจะพบหนังสือที่มี DDS # ที่ระบุและที่ จุดนั้นคุณได้พบหนังสือของคุณ

ดัชนีที่ไม่ใช่กลุ่มเป้าหมาย

แต่ถ้าคุณไม่ได้เข้าห้องสมุดด้วย DDS # ของหนังสือของคุณที่ถูกจดจำคุณจะต้องมีดัชนีที่สองเพื่อช่วยคุณ ในสมัยก่อนคุณจะพบที่ด้านหน้าของห้องสมุดสำนักมหัศจรรย์ที่เรียกว่า "แคตตาล็อกบัตร" ในนั้นมีการ์ด 3x5 หลายพันใบ - หนึ่งเล่มสำหรับหนังสือแต่ละเล่มเรียงตามลำดับตัวอักษร (ตามชื่อบางที) สอดคล้องกับการนี้"ไม่คลัสเตอร์ดัชนี" แคตตาล็อกการ์ดเหล่านี้ถูกจัดระเบียบในโครงสร้างแบบลำดับชั้นเพื่อให้แต่ละลิ้นชักจะถูกระบุด้วยช่วงของการ์ดที่มี ( Ka - Klเช่นตัวอย่างเช่น "โหนดกลาง") อีกครั้งคุณจะเจาะลึกจนกว่าคุณจะพบหนังสือของคุณ แต่ในกรณีนี้เมื่อคุณพบมัน (เช่น "โหนดใบ") คุณจะไม่มีหนังสือเล่มนั้นหมายเลขดัชนี (DDS #) ซึ่งคุณสามารถค้นหาหนังสือจริงในดัชนีคลัสเตอร์

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


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

1
การเปรียบเทียบที่ยอดเยี่ยม - ช่วยให้เห็นภาพได้จริงๆ!
เดนิส

71

ค้นหาคุณสมบัติบางประการของดัชนีแบบคลัสเตอร์และแบบไม่รวมกลุ่มด้านล่าง

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

  1. ดัชนีแบบคลัสเตอร์เป็นดัชนีที่ระบุแถวในตาราง SQL โดยไม่ซ้ำกัน
  2. ทุกตารางสามารถมีดัชนีคลัสเตอร์หนึ่งดัชนี
  3. คุณสามารถสร้างดัชนีคลัสเตอร์ที่ครอบคลุมมากกว่าหนึ่งคอลัมน์ ตัวอย่างเช่นcreate Index index_name(col1, col2, col.....).
  4. โดยค่าเริ่มต้นคอลัมน์ที่มีคีย์หลักมีดัชนีคลัสเตอร์อยู่แล้ว

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

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

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

4
@ ไนเจล, คีย์หลักหรือ UNIQUE INDEX?
anar khalilov

คำตอบที่เป็นประโยชน์และตรงไปตรงมาขอบคุณ @Anirudh Sood
Oscar Romero

50

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


47

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

ดัชนีคลัสเตอร์พิจารณาลำดับฟิสิคัลของ DATA ในตารางด้วยเหตุนี้ตารางจึงมีดัชนีคลัสเตอร์เพียง 1 รายการเท่านั้น

  • " พจนานุกรม " ไม่จำเป็นต้องมีดัชนีอื่นใดดัชนีอยู่แล้วตามคำ

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

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

  • " หนังสือเคมี " ที่จ้องมองมีดัชนีแยกต่างหากเพื่อชี้ตำแหน่งบทที่และที่ "จบ" มีดัชนีอื่นที่ชี้ไปยังตำแหน่ง WORDS ทั่วไป

6

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

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

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

nonclustered

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

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

การอ้างอิง: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described


4

ให้ฉันเสนอคำนิยามตำราเรียนใน "ดัชนีการจัดกลุ่ม" ซึ่งนำมาจาก 15.6.1 จากระบบฐานข้อมูล: The Complete Book :

นอกจากนี้เรายังอาจพูดถึงการจัดกลุ่มดัชนีซึ่งเป็นดัชนีในคุณลักษณะหรือคุณลักษณะเช่นที่ tuples ทั้งหมดที่มีค่าคงที่สำหรับคีย์ค้นหาของดัชนีนี้จะปรากฏขึ้นในบล็อกประมาณสองสามเท่าที่สามารถถือพวกเขา

เพื่อทำความเข้าใจคำนิยามลองดูตัวอย่าง 15.10 ที่จัดทำโดยตำรา:

ความสัมพันธ์R(a,b)ที่เรียงลำดับตามคุณลักษณะaและเก็บไว้ในลำดับที่บรรจุลงในบล็อกนั้นเป็นคลัสเตอร์อย่างแน่นอน ดัชนีบนaเป็นดัชนีการจัดกลุ่มเนื่องจากสำหรับa-value a1 ที่กำหนด tuples ทั้งหมดที่มีค่าaนั้นจะต่อเนื่องกัน พวกมันจึงปรากฏในกลุ่มของบล็อกอาจมี execept สำหรับบล็อกแรกและบล็อกสุดท้ายที่มี a-value a1 ตามที่แนะนำในรูปที่ 15.14 อย่างไรก็ตามดัชนีบน b ไม่น่าจะเป็นคลัสเตอร์เนื่องจาก tuples ที่มีbค่าคงที่จะกระจายไปทั่วไฟล์ยกเว้นค่าของaและbมีความสัมพันธ์อย่างใกล้ชิดมาก

รูปที่ 15.14

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

แนวคิดที่เกี่ยวข้องกับความสัมพันธ์แบบคลัสเตอร์ ความสัมพันธ์คือ "คลัสเตอร์" ถ้าสิ่งอันดับของมันถูกบรรจุลงในบล็อกอย่างคร่าวๆเพียงสองสามบล็อกเท่าที่จะสามารถเก็บสิ่งอันดับเหล่านั้นได้ กล่าวอีกนัยหนึ่งจากมุมมองบล็อกดิสก์หากมีสิ่งอันดับจากความสัมพันธ์ที่แตกต่างกันความสัมพันธ์เหล่านั้นไม่สามารถจัดกลุ่มได้ (กล่าวคือมีวิธีการจัดเก็บความสัมพันธ์ดังกล่าวมากขึ้นโดยการสลับ tuples ของความสัมพันธ์นั้นจากบล็อกดิสก์อื่น ๆ tuples ไม่ได้เป็นของความสัมพันธ์ในบล็อกดิสก์ปัจจุบัน) เห็นได้ชัดว่าR(a,b)ในตัวอย่างข้างต้นเป็นกลุ่ม

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

"Cluster" เป็นคำที่ถูกสแปมในทุกระดับของการจัดเก็บฐานข้อมูล (นามธรรมสามระดับ: abstraction: tuples, block, file) แนวคิดที่เรียกว่า " คลัสเตอร์ไฟล์ " ซึ่งอธิบายว่าไฟล์ (นามธรรมสำหรับกลุ่มบล็อก (หนึ่งหรือมากกว่าหนึ่งบล็อกดิสก์)) มีสิ่งอันดับจากความสัมพันธ์หนึ่งหรือความสัมพันธ์ที่แตกต่างกัน ไม่เกี่ยวข้องกับแนวคิดดัชนีการจัดกลุ่มเนื่องจากอยู่ในระดับไฟล์

อย่างไรก็ตามสื่อการสอนบางอย่างชอบกำหนดดัชนีการจัดกลุ่มตามคำจำกัดความของไฟล์คลัสเตอร์ นิยามสองชนิดเหล่านั้นเหมือนกันในระดับความสัมพันธ์แบบคลัสเตอร์ไม่ว่าจะกำหนดความสัมพันธ์แบบคลัสเตอร์ในแง่ของบล็อกดิสก์ข้อมูลหรือไฟล์ จากลิงค์ในวรรคนี้

ดัชนีบนแอตทริบิวต์ A ในไฟล์เป็นดัชนีการจัดกลุ่มเมื่อ: tuples ทั้งหมดที่มีค่าคุณลักษณะ A = a ถูกจัดเก็บตามลำดับ (= ติดต่อกัน) ในไฟล์ข้อมูล

การจัดเก็บสิ่งอันดับอย่างต่อเนื่องเหมือนกับการพูดว่า "สิ่งอันดับจะถูกบรรจุลงในบล็อกอย่างคร่าวๆสองสามช่วงตึกซึ่งสามารถเก็บสิ่งอันดับ" ได้ มันเป็นเพราะการเก็บ tuple อย่างต่อเนื่องเป็นวิธีที่จะบรรลุ "บรรจุลงในบล็อกประมาณสองสามชิ้นเท่าที่จะสามารถเก็บ tuples เหล่านั้น"


3

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

ดัชนีที่ไม่เป็นคลัสเตอร์: ไม่พบข้อมูลจริงของดัชนีที่ไม่ได้ทำคลัสเตอร์ที่โหนดโหนด แต่ต้องดำเนินการขั้นตอนเพิ่มเติมในการค้นหาเนื่องจากมีค่าของตัวระบุแถวที่ชี้ไปยังข้อมูลจริงเท่านั้น ดัชนีที่ไม่ใช่คลัสเตอร์ไม่สามารถจัดเรียงเป็นดัชนีที่คลัสเตอร์ได้ อาจมีดัชนีที่ไม่ใช่คลัสเตอร์หลายรายการต่อตารางจริง ๆ แล้วมันขึ้นอยู่กับรุ่นเซิร์ฟเวอร์ sql ที่เราใช้ โดยพื้นฐานแล้ว Sql server 2005 อนุญาตให้ดัชนีที่ไม่ใช่แบบคลัสเตอร์ 249 รายการและสำหรับรุ่นที่เหนือกว่าเช่นปี 2008, 2559 จะอนุญาตให้มีดัชนีที่ไม่ใช่แบบคลัสเตอร์ 999 รายการต่อตาราง


2

ดัชนีแบบกลุ่ม - ดัชนีแบบกลุ่มจะเป็นตัวกำหนดลำดับการจัดเก็บข้อมูลในตาราง ข้อมูลตารางสามารถเรียงลำดับด้วยวิธีเดียวดังนั้นจึงสามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตาราง ใน SQL Server ข้อ จำกัด คีย์หลักสร้างดัชนีคลัสเตอร์โดยอัตโนมัติในคอลัมน์นั้น

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

ความแตกต่างระหว่างดัชนีที่ทำคลัสเตอร์และไม่ทำคลัสเตอร์

  1. สามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตาราง อย่างไรก็ตามคุณสามารถสร้างดัชนีที่ไม่ทำคลัสเตอร์หลายรายการในตารางเดียว
  2. ดัชนีแบบกลุ่มจะเรียงลำดับตารางเท่านั้น ดังนั้นจึงไม่ใช้พื้นที่เก็บข้อมูลเพิ่มเติม ดัชนีที่ไม่ใช่คลัสเตอร์จะถูกเก็บไว้ในที่ที่แยกต่างหากจากตารางจริงที่อ้างถึงพื้นที่เก็บข้อมูลเพิ่มเติม
  3. ดัชนีแบบกลุ่มนั้นเร็วกว่าดัชนีแบบไม่รวมกลุ่มเนื่องจากไม่เกี่ยวข้องกับขั้นตอนการค้นหาพิเศษใด ๆ

สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี้บทความ

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