GUID อาจดูเหมือนเป็นทางเลือกที่เป็นธรรมชาติสำหรับคีย์หลักของคุณ - และถ้าคุณต้องใช้จริง ๆ คุณอาจจะโต้แย้งว่ามันใช้สำหรับคีย์หลักของตาราง สิ่งที่ฉันขอแนะนำไม่ควรทำคือใช้คอลัมน์ GUID เป็นคีย์การทำคลัสเตอร์ซึ่ง SQL Server จะทำตามค่าเริ่มต้นเว้นแต่คุณจะบอกเป็นพิเศษ
คุณต้องแยกสองประเด็นออกจากกันจริงๆ:
คีย์หลักคือการสร้างตรรกะ - หนึ่งในกุญแจผู้สมัครที่ไม่ซ้ำกันและเชื่อถือได้ระบุทุกแถวในตารางของคุณ นี้ได้อะไรจริงๆ - ค่าINT
เป็นGUID
สตริง - การเลือกสิ่งที่จะทำให้ความรู้สึกมากที่สุดสำหรับสถานการณ์ของคุณ
ที่สำคัญการจัดกลุ่ม (คอลัมน์หรือคอลัมน์ที่กำหนด "ดัชนีคลัสเตอร์" ในตาราง) - นี้เป็นทางกายภาพสิ่งที่จัดเก็บข้อมูลที่เกี่ยวข้องและที่นี่มีขนาดเล็กที่มีความเสถียรที่เพิ่มมากขึ้นชนิดข้อมูลเป็นเลือกที่ดีที่สุดของคุณ - INT
หรือBIGINT
เป็นของคุณ ตัวเลือกเริ่มต้น
โดยค่าเริ่มต้นคีย์หลักในตาราง SQL Server ยังใช้เป็นคีย์การทำคลัสเตอร์ - แต่นั่นไม่จำเป็นต้องเป็นอย่างนั้น! ฉันเห็นการเพิ่มประสิทธิภาพขนาดใหญ่เป็นการส่วนตัวเมื่อแบ่งคีย์หลัก / คลัสเตอร์แบบอิง GUID ก่อนหน้านี้เป็นสองคีย์แยก - คีย์หลัก (ตรรกะ) บน GUID และคีย์การจัดกลุ่ม (การสั่งซื้อ) ในINT IDENTITY(1,1)
คอลัมน์แยกต่างหาก
ในฐานะที่เป็นKimberly Tripp - ราชินีแห่งการจัดทำดัชนี - และคนอื่น ๆ ได้ระบุไว้หลายครั้งมาก - a GUID
เนื่องจากคีย์การจัดกลุ่มไม่เหมาะสมเนื่องจากเนื่องจากการสุ่มมันจะนำไปสู่การกระจายตัวของหน้าเว็บขนาดใหญ่และดัชนี
ใช่ฉันรู้ - มีnewsequentialid()
อยู่ใน SQL Server 2005 และใหม่กว่า - แต่ถึงอย่างนั้นก็ไม่ได้เรียงตามลำดับอย่างแท้จริงและเต็มไปด้วยปัญหาเช่นเดียวกับGUID
- เพียงเล็กน้อยน้อยเด่นชัดดังนั้น
จากนั้นก็มีอีกเรื่องที่ต้องพิจารณา: คีย์การทำคลัสเตอร์บนตารางจะถูกเพิ่มลงในแต่ละรายการในดัชนีแต่ละรายการที่ไม่ใช่คลัสเตอร์บนตารางของคุณเช่นกัน - ดังนั้นคุณต้องการทำให้แน่ใจว่ามันมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ โดยปกติแล้วINT
แถวที่มีมากกว่า 2 พันล้านแถวนั้นน่าจะเพียงพอสำหรับตารางส่วนใหญ่และเมื่อเปรียบเทียบกับGUID
คีย์การทำคลัสเตอร์คุณสามารถประหยัดพื้นที่เก็บข้อมูลได้นับร้อยเมกะไบต์บนดิสก์และในหน่วยความจำเซิร์ฟเวอร์
การคำนวณอย่างรวดเร็ว - การใช้INT
กับGUID
เป็นหลักและคีย์การทำคลัสเตอร์:
- ตารางพื้นฐานที่มี 1'000'000 แถว (3.8 MB เทียบกับ 15.26 MB)
- 6 ดัชนีที่ไม่เป็นคลัสเตอร์ (22.89 MB เทียบกับ 91.55 MB)
รวม: 25 MB เทียบกับ 106 MB - และนั่นเป็นเพียงตารางเดียว!
อาหารสำหรับความคิดเพิ่มเติม - สิ่งที่ยอดเยี่ยมโดย Kimberly Tripp - อ่านอ่านอีกครั้งย่อย! มันเป็นพระวรสารการจัดทำดัชนีของ SQL Server จริงๆ
ป.ล. : แน่นอนถ้าคุณต้องติดต่อกับแถวสองสามร้อยหรือสองสามพัน - ข้อโต้แย้งเหล่านี้ส่วนใหญ่จะไม่ส่งผลกระทบต่อคุณมากนัก แต่ถ้าคุณได้รับในหลายสิบหรือหลายร้อยหลายพันแถวหรือคุณเริ่มต้นนับล้าน - แล้วจุดเหล่านั้นกลายเป็นสิ่งสำคัญมากและมีความสำคัญมากที่จะเข้าใจ
อัปเดต:หากคุณต้องการให้PKGUID
คอลัมน์เป็นคีย์หลักของคุณ (แต่ไม่ใช่คีย์การทำคลัสเตอร์) และอีกคอลัมน์หนึ่งMYINT
( INT IDENTITY
) เป็นคีย์การทำคลัสเตอร์ของคุณให้ใช้สิ่งนี้:
CREATE TABLE dbo.MyTable
(PKGUID UNIQUEIDENTIFIER NOT NULL,
MyINT INT IDENTITY(1,1) NOT NULL,
.... add more columns as needed ...... )
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY NONCLUSTERED (PKGUID)
CREATE UNIQUE CLUSTERED INDEX CIX_MyTable ON dbo.MyTable(MyINT)
โดยทั่วไป: คุณเพียงแค่ต้องบอกข้อ จำกัดอย่างชัดเจนPRIMARY KEY
ว่ามันNONCLUSTERED
(ไม่เช่นนั้นจะสร้างเป็นดัชนีคลัสเตอร์ของคุณโดยค่าเริ่มต้น) - จากนั้นคุณสร้างดัชนีที่สองที่กำหนดไว้เป็นCLUSTERED
สิ่งนี้จะใช้งานได้ - และเป็นตัวเลือกที่ถูกต้องหากคุณมีระบบที่มีอยู่ซึ่งต้องมีการ "ออกแบบใหม่" เพื่อประสิทธิภาพ สำหรับระบบใหม่ถ้าคุณเริ่มต้นจากศูนย์และคุณไม่ได้อยู่ในสถานการณ์การจำลองแบบฉันจะเลือกID INT IDENTITY(1,1)
เป็นคีย์หลักกลุ่มของฉัน - มีประสิทธิภาพมากกว่าสิ่งอื่นใดเสมอ!