ไม่มีอะไรผิดปกติกับ GUID ในฐานะคีย์และคลัสเตอร์ในระบบ OLTP (ยกเว้นว่าคุณมีดัชนีจำนวนมากบนโต๊ะที่ประสบปัญหาจากขนาดที่เพิ่มขึ้นของคลัสเตอร์) ตามจริงแล้วพวกมันสามารถปรับขนาดได้มากกว่าคอลัมน์ประจำตัว
มีความเชื่ออย่างกว้างขวางว่า GUID เป็นปัญหาที่ยิ่งใหญ่ใน SQL Server ซึ่งส่วนใหญ่เป็นเรื่องที่ผิด ตามความเป็นจริง GUID สามารถปรับขนาดได้อย่างมีนัยสำคัญบนกล่องที่มีมากกว่า 8 แกน:
ฉันขอโทษ แต่นักพัฒนาซอฟต์แวร์ของคุณถูกต้อง กังวลเกี่ยวกับสิ่งอื่น ๆ ก่อนที่คุณจะกังวลเกี่ยวกับ GUID
อ้อและสุดท้าย: ทำไมคุณต้องการดัชนีคลัสเตอร์ตั้งแต่แรก? หากความกังวลของคุณเป็นระบบ OLTP ที่มีดัชนีขนาดเล็กจำนวนมากคุณน่าจะดีกว่าด้วยกอง
ให้เราพิจารณาว่าการกระจายตัวของข้อมูลใดบ้าง (ซึ่ง GUID จะแนะนำ) ให้อ่านของคุณ มีสามปัญหาที่สำคัญกับการกระจายตัวของ:
- หน้าแยก I / O ดิสก์ค่าใช้จ่าย
- ครึ่งหน้าเต็มไม่ได้เป็นหน่วยความจำที่มีประสิทธิภาพเท่ากับเต็มหน้า
- มันทำให้หน้าถูกจัดเก็บนอกลำดับซึ่งทำให้ I / O ตามลำดับมีโอกาสน้อยลง
เนื่องจากความกังวลของคุณในคำถามเกี่ยวกับความสามารถในการปรับขนาดได้ซึ่งเราสามารถกำหนดเป็น "การเพิ่มฮาร์ดแวร์เพิ่มเติมทำให้ระบบทำงานได้เร็วขึ้น" ปัญหาเหล่านี้เป็นปัญหาน้อยที่สุดของคุณ เพื่อที่อยู่แต่ละคนในทางกลับกัน
โฆษณา 1) หากคุณต้องการเพิ่มขนาดคุณสามารถซื้อ I / O ได้ แม้แต่ Samsung / Intel 512GB SSD ราคาถูก (เพียงไม่กี่ USD / GB) คุณจะได้รับมากกว่า 100K IOPS คุณจะไม่ต้องเสียเวลาอีกต่อไปในระบบซ็อกเก็ต 2 ตัว และถ้าคุณควรเจอสิ่งนั้นให้ซื้อเพิ่มอีกหนึ่งชุด
โฆษณา 2) หากคุณลบตารางคุณจะมีครึ่งหน้าเต็มอยู่แล้ว และแม้ว่าคุณจะทำไม่ได้หน่วยความจำราคาถูกและสำหรับทุกคน แต่เป็นระบบ OLTP ที่ใหญ่ที่สุด - ข้อมูลน่าสนใจควรจะอยู่ที่นั่น การหาแพ็คข้อมูลลงในหน้าต่างๆเป็นการเพิ่มประสิทธิภาพย่อยเมื่อคุณกำลังมองหาเครื่องชั่ง
โฆษณา 3) ตารางที่สร้างจากการแบ่งหน้าบ่อย ๆ ข้อมูลที่มีการแยกส่วนอย่างมากจะสุ่ม I / O ที่ความเร็วเดียวกับที่ตารางเต็มตามลำดับ
สำหรับการเข้าร่วมนั้นมีประเภทการเข้าร่วมที่สำคัญสองประเภทที่คุณน่าจะเห็นใน OLTP เช่นปริมาณงาน: แฮชและลูป ให้ดูแต่ละด้าน:
การเข้าร่วมแฮช:การแฮชการรวมเข้าจะถือว่าตารางเล็ก ๆ ถูกสแกนและโดยทั่วไปจะเป็นการค้นหาที่ใหญ่กว่า ตารางขนาดเล็กมีแนวโน้มที่จะอยู่ในหน่วยความจำดังนั้น I / O ไม่ได้เป็นความกังวลของคุณที่นี่ เราได้สัมผัสกับความจริงที่ว่าการค้นหามีค่าใช้จ่ายเท่ากันในดัชนีการแยกส่วนเช่นเดียวกับในดัชนีที่ไม่มีการแยกส่วน
การเข้าร่วมแบบวนซ้ำ: ค้นหาตารางด้านนอก ราคาเดียวกัน
คุณอาจมีการสแกนตารางที่ไม่ดีจำนวนมากเกิดขึ้น - แต่ GUID นั้นไม่ใช่ความกังวลของคุณอีกแล้วการจัดทำดัชนีที่เหมาะสมคือ
ตอนนี้คุณอาจมีช่วงการสแกนที่ถูกต้องเกิดขึ้น (โดยเฉพาะอย่างยิ่งเมื่อเข้าร่วมในคีย์ต่างประเทศ) และในกรณีนี้ข้อมูลที่อยู่อย่างกระจัดกระจายจะน้อยกว่า "บรรจุ" เมื่อเปรียบเทียบกับข้อมูลที่ไม่ได้แยกส่วน แต่ให้เราพิจารณาสิ่งที่คุณจะได้เห็นจากการรวมเข้าด้วยกันเป็นดัชนีข้อมูล 3NF คือ:
การเข้าร่วมจากตารางที่มีการอ้างอิงคีย์ต่างประเทศกับคีย์หลักของตารางที่อ้างอิง
วิธีอื่น ๆ
โฆษณา 1) ในกรณีนี้คุณกำลังมองหาคีย์หลักเพียงครั้งเดียว - เข้าร่วม n to 1 การกระจายตัวหรือไม่ค่าใช้จ่ายเท่ากัน (หนึ่งค้นหา)
โฆษณา 2) ในกรณีนี้คุณกำลังเข้าร่วมกับคีย์เดียวกัน แต่อาจดึงข้อมูลได้มากกว่าหนึ่งแถว (ค้นหาช่วง) การเข้าร่วมในกรณีนี้คือ 1 ถึง n อย่างไรก็ตามตารางต่างประเทศที่คุณค้นหาคุณกำลังค้นหาคีย์ SAME ซึ่งมีแนวโน้มที่จะอยู่ในหน้าเดียวกันในดัชนีแยกส่วนเช่นเดียวกับที่ไม่ได้แยกส่วน
พิจารณากุญแจต่างประเทศเหล่านั้นสักครู่ แม้ว่าคุณจะมีลำดับ "สมบูรณ์" ในการวางคีย์หลักของเรา - สิ่งที่ชี้ไปที่คีย์นั้นจะยังคงไม่เรียงตามลำดับ
แน่นอนว่าคุณอาจใช้งานเครื่องเสมือนใน SAN บางแห่งในธนาคารบางแห่งที่มีเงินถูกและสูงในกระบวนการ จากนั้นคำแนะนำทั้งหมดนี้จะหายไป แต่ถ้านั่นคือโลกของคุณความสามารถในการปรับขยายอาจไม่ใช่สิ่งที่คุณกำลังมองหา - คุณกำลังมองหาประสิทธิภาพและความเร็ว / ค่าใช้จ่ายสูง - ซึ่งทั้งสองอย่างแตกต่างกัน