ดัชนีหลายรายการเทียบกับดัชนีหลายคอลัมน์


645

ฉันเพิ่งเพิ่มดัชนีไปยังตารางใน SQL Server 2005 และมันทำให้ฉันคิด อะไรคือความแตกต่างระหว่างการสร้าง 1 ดัชนีและการกำหนดหลายคอลัมน์โดยมี 1 ดัชนีต่อคอลัมน์ที่คุณต้องการจัดทำดัชนี

มีเหตุผลบางอย่างว่าทำไมจึงควรใช้อีกอันหนึ่ง?

ตัวอย่างเช่น

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

กับ

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

คำตอบ:


319

ฉันเห็นด้วยกับเคดรูส์

บทความนี้จะนำคุณไปสู่เส้นทางที่ถูกต้อง:

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

ประการที่สองหากคุณสร้างดัชนีอื่น ๆ ในข้อมูลของคุณและพวกเขาสร้างอย่างชาญฉลาดพวกเขาจะถูกนำมาใช้ใหม่

เช่นลองนึกภาพคุณค้นหาตารางในสามคอลัมน์

รัฐมณฑลรหัสไปรษณีย์

  • บางครั้งคุณค้นหาตามรัฐเท่านั้น
  • บางครั้งคุณค้นหาจากรัฐและเคาน์ตี
  • คุณมักจะค้นหาโดยรัฐเขตไปรษณีย์

จากนั้นดัชนีที่มีรัฐมณฑลรหัสไปรษณีย์ จะถูกใช้ในการค้นหาทั้งสามนี้

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

จากนั้นคุณสามารถสร้างดัชนีบน Zip เพียงอย่างเดียวที่จะใช้ในอินสแตนซ์นี้

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

ฉันเดาว่าคำตอบที่คุณกำลังมองหาคือมันขึ้นอยู่กับคำสั่งที่คุณใช้บ่อยและกลุ่มของคุณ

บทความจะช่วยได้มาก :-)


2
ดังนั้นสิ่งที่ดีที่สุดที่จะทำคือการกำหนดดัชนีสำหรับรัฐเคาน์ตีและรหัสไปรษณีย์นอกเหนือจากดัชนีแต่ละรายการสำหรับแต่ละคอลัมน์
Maxim Zaslavsky

12
@jball ฉันทำอะไรบางอย่างหายไปหรือเปล่า ดูเหมือนว่าบทความส่วนใหญ่เกี่ยวกับความแตกต่างระหว่างข้อ จำกัด รุ่นของ SQL Server สามารถย้ายบทความได้หรือไม่
Ian R. O'Brien

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

1
1) "โดยทั่วไป [ดัชนีคลัสเตอร์ที่มีคอลัมน์ตัวตนเป็นครั้งแรก] ช่วยให้การแทรกข้อมูลของคุณในตอนท้ายของดัชนี" ถูกต้อง "และไม่ก่อให้เกิดดิสก์ IO และการแบ่งหน้าจำนวนมาก" เป็นเท็จทั้งหมดในระบบผู้ใช้หลายคน ความจริงก็คือมันรับประกันความขัดแย้งสูง (การเกิดพร้อมกันต่ำ) ในระบบผู้ใช้หลายคน 2) ดัชนีแบบคลัสเตอร์ควรเป็น Relational Key เช่น ไม่ IDENTITY, GUID, etc3) "จากนั้นดัชนีที่มีรัฐมณฑลรหัสไปรษณีย์จะถูกใช้ในการค้นหาทั้งสามรายการ" เป็นเท็จและขัดแย้งกับ "คอลัมน์แรกสามารถใช้งานได้" คอลัมน์ที่สอง & หมวดย่อยในดัชนีไม่สามารถใช้สำหรับการค้นหา
PerformanceDBA

82

ใช่. ผมขอแนะนำให้คุณตรวจสอบบทความคิมเบอร์ลี Tripp เกี่ยวกับการจัดทำดัชนี

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

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

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


7
Kimberly Tripp รู้ว่าเธอกำลังพูดถึงอะไร ฉันกำลังพูดคุยกับเธอและเธอรู้สิ่งนี้จากภายใน คำแนะนำที่ดี
evilhomer

@CadeRoux ถ้าส่วนใหญ่เวลาที่ clause ของฉันมี 2 คอลัมน์ในความสัมพันธ์ '&' มันจะดีกว่าไหมถ้ามีดัชนีหลายคอลัมน์ในพวกเขาหรือดัชนีคอลัมน์เดียวกับทั้งคู่
มันเป็นกับดัก

2
@RachitGupta หนึ่งดัชนีที่มีทั้งสองคอลัมน์
Cade Roux

41

ดัชนีหลายคอลัมน์สามารถใช้สำหรับแบบสอบถามที่อ้างอิงคอลัมน์ทั้งหมด :

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

สิ่งนี้สามารถค้นหาได้โดยตรงโดยใช้ดัชนีหลายคอลัมน์ ในอีกทางหนึ่งดัชนีส่วนใหญ่สามารถใช้ดัชนีเดียวได้ (ต้องค้นหาระเบียนทั้งหมดที่มี Column1 = 1 แล้วตรวจสอบคอลัมน์ 2 และคอลัมน์ 3 ในแต่ละคอลัมน์)


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

17

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


+1 สำหรับคำอธิบายที่ดีที่เชื่อมโยงถึงวิธีการใช้ดัชนี (ธรรมดา) ที่เกี่ยวข้องกับคำถาม
RobM

8

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

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

การสร้างดัชนีในคอลัมน์เดียวมีประโยชน์สำหรับการค้นหาที่พบบ่อยในระบบ OLTP

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

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