สามารถTABLE
มีคีย์หลักโดยไม่มีดัชนีคลัสเตอร์ได้หรือไม่?
และสามารถTABLE
มีดัชนีคลัสเตอร์โดยไม่ต้องมีคีย์หลักได้หรือไม่?
ใครช่วยบอกความสัมพันธ์ระหว่างคีย์หลักกับดัชนีคลัสเตอร์สั้น ๆ ได้ไหม
สามารถTABLE
มีคีย์หลักโดยไม่มีดัชนีคลัสเตอร์ได้หรือไม่?
และสามารถTABLE
มีดัชนีคลัสเตอร์โดยไม่ต้องมีคีย์หลักได้หรือไม่?
ใครช่วยบอกความสัมพันธ์ระหว่างคีย์หลักกับดัชนีคลัสเตอร์สั้น ๆ ได้ไหม
คำตอบ:
คีย์หลักเป็นแนวคิดเชิงตรรกะซึ่งเป็นตัวระบุเฉพาะสำหรับแถวในตาราง ด้วยเหตุนี้จึงมีแอตทริบิวต์มากมาย - อาจไม่เป็นค่าว่างและต้องไม่ซ้ำกัน แน่นอนว่าเนื่องจากคุณมีแนวโน้มที่จะค้นหาระเบียนโดยใช้ตัวระบุที่ไม่ซ้ำกันเป็นจำนวนมากจึงเป็นการดีที่จะมีดัชนีในคีย์หลัก
ดัชนีคลัสเตอร์เป็นแนวคิดทางกายภาพ - เป็นดัชนีที่มีผลต่อลำดับการจัดเก็บระเบียนบนดิสก์ ทำให้เป็นดัชนีที่เร็วมากเมื่อเข้าถึงข้อมูลแม้ว่าจะเขียนช้าลงหากคีย์หลักของคุณไม่ใช่หมายเลขลำดับ
ได้คุณสามารถมีคีย์หลักได้โดยไม่ต้องมีดัชนีคลัสเตอร์และบางครั้งคุณอาจต้องการ (ตัวอย่างเช่นเมื่อคีย์หลักของคุณเป็นคีย์ต่างประเทศรวมกันบนตารางการเข้าร่วมและคุณไม่ต้องการให้มีค่าใช้จ่ายในการสลับดิสก์ เมื่อเขียน)
ได้คุณสามารถสร้างดัชนีคลัสเตอร์ในคอลัมน์ที่ไม่ใช่คีย์หลัก
ตารางสามารถมีคีย์หลักที่ไม่ใช่คลัสเตอร์และตารางที่คลัสเตอร์ไม่จำเป็นต้องใช้คีย์หลัก ดังนั้นคำตอบของทั้งสองคำถามคือใช่
ดัชนีคลัสเตอร์เก็บคอลัมน์ทั้งหมดที่ระดับใบไม้ นั่นหมายความว่าดัชนีคลัสเตอร์มีข้อมูลทั้งหมดในตาราง ตารางที่ไม่มีดัชนีคลัสเตอร์เรียกว่าฮีป
คีย์หลักคือดัชนีเฉพาะที่คลัสเตอร์โดยค่าเริ่มต้น ตามค่าเริ่มต้นหมายความว่าเมื่อคุณสร้างคีย์หลักหากตารางยังไม่ได้ทำคลัสเตอร์คีย์หลักจะถูกสร้างเป็นดัชนีเฉพาะของคลัสเตอร์ เว้นแต่คุณจะระบุ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);
ครั้งแรกของทั้งหมดจะดูที่ตารางดัชนีจัดและดัชนีคลัสเตอร์ จริงๆแล้วฉันแนะนำให้อ่านทั้งหมด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 คีย์หลักจะถูกทำคลัสเตอร์ตามค่าเริ่มต้นด้วย คุณสามารถเปลี่ยนค่าเริ่มต้นดังกล่าวข้างต้นได้
คำตอบที่นำมาจากMSDN โดยใช้ Clustered Indexes
ตารางสามารถมีคีย์หลักที่ไม่มีดัชนีคลัสเตอร์ได้หรือไม่? - ใช่
ตารางสามารถมีดัชนีคลัสเตอร์โดยไม่มีคีย์หลักได้หรือไม่? - ใช่
คีย์หลักเป็นข้อ จำกัดที่ทำให้เอกลักษณ์ของค่าเช่นว่าแถวสามารถระบุได้โดยเฉพาะที่สำคัญที่
ดัชนีที่ได้รับมอบหมายโดยอัตโนมัติไปยังคีย์หลัก (แถวมักจะ "เงยหน้าขึ้นมอง" โดยคีย์หลักของพวกเขา)
ดัชนีไม่ใช่คลัสเตอร์คือการสั่งซื้อตรรกะของแถวโดยหนึ่ง (หรือมากกว่า) ของคอลัมน์ คิดว่ามันเป็น "สำเนา" ของตารางที่มีประสิทธิภาพโดยเรียงตามคอลัมน์ใด ๆ ก็ตามที่ดัชนีอยู่ตรงข้าม
ดัชนีคลัสเตอร์คือเมื่อเกิดขึ้นจริงตารางเป็นคำสั่งทางร่างกายโดยเฉพาะอย่างยิ่งคอลัมน์ ตารางจะไม่มีดัชนีคลัสเตอร์เสมอไป (กล่าวคือในขณะที่บางสิ่งจะเรียงลำดับทางกายภาพสิ่งนั้นอาจไม่ได้กำหนด ) ตารางไม่สามารถมีดัชนีคลัสเตอร์ได้มากกว่าหนึ่งดัชนีแม้ว่าจะสามารถมีดัชนีคลัสเตอร์คอมโพสิตเดียวได้ (เช่นตารางเรียงลำดับตามร่างกายเช่นนามสกุล, ชื่อ, DOB)
PK มักเป็นดัชนีคลัสเตอร์ (แต่ไม่เสมอไป)
สำหรับสิ่งที่ควรค่าใน MS SQL Server คอลัมน์ทั้งหมดในคีย์หลักต้องถูกกำหนดเป็น NOT Null ในขณะที่การสร้างดัชนีคลัสเตอร์ที่ไม่ซ้ำกันไม่ต้องการสิ่งนี้ ไม่แน่ใจเกี่ยวกับระบบ DB อื่น ๆ
อาจไม่เกี่ยวข้องกับคำตอบสำหรับคำถามนี้ แต่ประเด็นสำคัญบางประการของคีย์หลักและดัชนีคลัสเตอร์ ได้แก่ ->
หากมีคีย์หลัก (โดยค่าเริ่มต้นซึ่งเป็นดัชนีคลัสเตอร์อย่างไรก็ตามเราสามารถเปลี่ยนแปลงได้) ด้วยดัชนีคลัสเตอร์เราจะไม่สามารถสร้างดัชนีคลัสเตอร์อีกหนึ่งรายการสำหรับตารางนั้นได้ แต่ถ้ายังไม่มีชุดคีย์หลักและมีดัชนีคลัสเตอร์เราจะไม่สามารถสร้างคีย์หลักด้วยดัชนีคลัสเตอร์ได้