ความสัมพันธ์ของคีย์หลักและดัชนีคลัสเตอร์


92

สามารถTABLEมีคีย์หลักโดยไม่มีดัชนีคลัสเตอร์ได้หรือไม่?

และสามารถTABLEมีดัชนีคลัสเตอร์โดยไม่ต้องมีคีย์หลักได้หรือไม่?

ใครช่วยบอกความสัมพันธ์ระหว่างคีย์หลักกับดัชนีคลัสเตอร์สั้น ๆ ได้ไหม

คำตอบ:


102

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

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

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

ได้คุณสามารถสร้างดัชนีคลัสเตอร์ในคอลัมน์ที่ไม่ใช่คีย์หลัก


1
สวัสดี. หัวข้อเก่า แต่อาจมีคนตอบคำถามของฉันได้ ถ้าคอลัมน์ถูกประกาศว่าไม่ใช่ NULL UNIQUE CLUSTERED INDEX จะทำให้ PRIMARY KEY เปลี่ยนแปลงประสิทธิภาพหรืออะไรได้จริงหรือไม่
jesse

นั่นเป็นคำถามที่น่าสนใจ ฉันจะถือว่าไม่เนื่องจากจะต้องทำการตรวจสอบแบบเดียวกันทั้งหมดไม่ว่าจะด้วยวิธีใดก็ตาม
Jonathan Allen

คำตอบที่ยอดเยี่ยม
NikosV

แต่ส่วนใหญ่, คอลัมน์คีย์หลักที่มีดัชนีคลัสเตอร์จะมีประโยชน์เนื่องจากทำให้ช่วงค้นหาง่ายขึ้นมาก
hunter_tech

34

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

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

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

ตัวอย่างที่t1มีคีย์หลักที่t2ไม่ใช่คลัสเตอร์และไม่ได้อยู่ในคลัสเตอร์ แต่มีคีย์หลัก:

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

ตัวอย่างที่ SQL Fiddle


19

ครั้งแรกของทั้งหมดจะดูที่ตารางดัชนีจัดและดัชนีคลัสเตอร์ จริงๆแล้วฉันแนะนำให้อ่านทั้งหมดUse the Index Luke! ตั้งแต่เริ่มต้นจนถึงหัวข้อการจัดกลุ่มเพื่อทำความเข้าใจว่าเกิดอะไรขึ้น

ตอนนี้สำหรับคำถามของคุณ ...


ตารางสามารถมีคีย์หลักที่ไม่มีดัชนีคลัสเตอร์ได้หรือไม่?

ใช่ใช้คำหลักแบบไม่รวมเมื่อประกาศคีย์หลักของคุณเพื่อสร้างตารางตามฮีป ตัวอย่างเช่น:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

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


และตารางสามารถมีดัชนีคลัสเตอร์โดยไม่มีคีย์หลักได้หรือไม่?

ซึ่งแตกต่างจาก DBMS อื่น ๆ MS SQL Server จะช่วยให้คุณมีดัชนีการทำคลัสเตอร์ที่แตกต่างจากคีย์หลักหรือแม้กระทั่งไม่ต้องมีคีย์หลักเลย

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

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

หากคุณเลือกดัชนีการทำคลัสเตอร์ที่ไม่ซ้ำกัน (ใช้CREATE CLUSTERED INDEX ...) MS SQL Server จะทำให้ไม่ซ้ำกันโดยอัตโนมัติโดยการเพิ่มฟิลด์ที่ซ่อนอยู่

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


ใครช่วยบอกความสัมพันธ์ของคีย์หลักและดัชนีคลัสเตอร์สั้น ๆ ได้ไหม

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


4

คำตอบที่นำมาจากMSDN โดยใช้ Clustered Indexes

ตารางสามารถมีคีย์หลักที่ไม่มีดัชนีคลัสเตอร์ได้หรือไม่? - ใช่

ตารางสามารถมีดัชนีคลัสเตอร์โดยไม่มีคีย์หลักได้หรือไม่? - ใช่

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

ดัชนีที่ได้รับมอบหมายโดยอัตโนมัติไปยังคีย์หลัก (แถวมักจะ "เงยหน้าขึ้นมอง" โดยคีย์หลักของพวกเขา)

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

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

PK มักเป็นดัชนีคลัสเตอร์ (แต่ไม่เสมอไป)


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

ตารางสามารถมีคีย์หลักโดยไม่มีดัชนีได้หรือไม่? เพราะเมื่อฉันบอกว่าคอลัมน์หนึ่งเป็นคีย์หลักโดยค่าเริ่มต้นจะถูกสร้างดัชนีคลัสเตอร์ เมื่อลบดัชนีตารางไม่มีคีย์หลักอีกต่อไป?
veljasije

1

สำหรับสิ่งที่ควรค่าใน MS SQL Server คอลัมน์ทั้งหมดในคีย์หลักต้องถูกกำหนดเป็น NOT Null ในขณะที่การสร้างดัชนีคลัสเตอร์ที่ไม่ซ้ำกันไม่ต้องการสิ่งนี้ ไม่แน่ใจเกี่ยวกับระบบ DB อื่น ๆ


นี่คือความคิดเห็นเพิ่มเติมภายใต้คำตอบที่ทำเครื่องหมายว่าถูกต้อง
ม.ค. Doggen

1
ยินดีต้อนรับ - ฉันให้ +1 เพราะเห็นว่าคุณยังไม่มีชื่อเสียงที่จะเพิ่มความคิดเห็น (ไปที่นั่นเสร็จแล้ว :)
Reversed Engineer

0

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

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

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