ดัชนีหนึ่งหรือสอง


11

ฉันสร้างดัชนีต่อไปนี้บนตารางในฐานข้อมูลของฉัน:

CREATE INDEX [idx_index1]
on [table1]
(col1, col2, col3)

เซิร์ฟเวอร์กำลังแนะนำดัชนี 'ขาดหายไป' ต่อไปนี้:

CREATE INDEX [idx_index2]
on [table1]
(col1, col2)
INCLUDE (col3, col4, col5, col6....)

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

คำตอบ:


12

และเข้าสู่ศิลปะของการปรับแต่งประสิทธิภาพและกลยุทธ์การจัดทำดัชนี ...

ดูเหมือนว่าฉันมีเหตุผลที่จะแก้ไขคำจำกัดความดัชนีที่มีอยู่เพื่อรวมคอลัมน์ที่แนะนำ

ฉันจะใช้ใบเสนอราคาของคุณและเขียนคำนิยามดัชนีที่สาม:

create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);

นั่นควรเป็นCREATE INDEXข้อความที่สอดคล้องกับข้อความที่ยกมาของคุณ

นั่นอาจเป็นทางออกที่ดี แต่ก็ขึ้นอยู่กับว่า ต่อไปนี้เป็นตัวอย่างเมื่อฉันบอกว่ามันขึ้นอยู่กับ

หากคุณมีปริมาณงานทั่วไปที่ส่วนใหญ่ประกอบด้วยแบบสอบถามเช่นนี้:

select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;

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

แต่ถ้าคุณมีปริมาณงานที่ประกอบด้วยการสืบค้นส่วนใหญ่จะเป็นดังนี้:

select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;

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

ด้วยคำแนะนำของคุณมันจะเหมาะสำหรับแบบสอบถามดังต่อไปนี้:

select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;

idx_index3คำแนะนำของคุณจะเป็นดัชนีครอบคลุมที่เป็นไปตามเกณฑ์การค้นหาสำหรับข้อความค้นหาด้านบน

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

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

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


ฉันจะต้องแยกแยะเรื่องนั้นซักพัก แต่ดูเหมือนจะเป็นคำตอบที่ดี ฉันคิดว่ามันเป็นตัวพิมพ์ผิดที่ 'index3' ที่คุณกำหนดไว้มี col3 เป็นคอลัมน์ความเสมอภาคและคอลัมน์ที่รวม?
paulH

อ๋อ :-) จับได้ดี ฉันแก้ไขมันแล้ว
Thomas Stringer

ไม่ต้องพูดถึงว่าถ้าตารางมีเพียงคอลัมน์ 1-6 ก็ค่อนข้างโง่ที่จะจัดทำดัชนี 1 & 2 และรวม 3-5
Kenneth Fisher

1
@ KennethFisher - ทำไมมันถึงโง่? ดูเหมือนว่ามีเหตุผลพอที่จะทำถ้าโครงสร้างฐานข้อมูลของคุณและภาระงานของคุณรับประกัน เช่นถ้าคุณมีแบบสอบถามที่เลือกคอลัมน์ 1-5 ตามค่าของคอลัมน์ 1 และ 2 และบางทีคอลัมน์ 6 เป็นคอลัมน์ nvarchar (สูงสุด) ที่คุณไม่ต้องการขยายดัชนีของคุณ
paulH

1
@ พอลมันอาจเป็นเพียงความคิดเห็นของฉัน แต่ ณ จุดที่คุณเพิ่มคอลัมน์ลงไปพอที่จะรวมว่าดัชนีของคุณมี 90 +% ของคอลัมน์ในตารางคุณได้ทำให้ดัชนีของคุณป่องจนถึงจุดที่การอ่านพิเศษไปที่ตาราง ตัวเองไม่ได้เป็นสิ่งที่สำคัญทั้งหมด ตอนนี้มีข้อยกเว้นอย่างแน่นอน .. ถ้า cols 1-5 เป็น int ทั้งหมดและ col6 เป็น varchar (สูงสุด) ดังนั้นฉันอาจทำเช่นนั้น แต่โดยทั่วไปฉันจะดูอย่างระมัดระวัง
Kenneth Fisher

7

คุณถูกต้องและได้ค้นพบว่าเหตุใด DBA จึงจำเป็นต้องตรวจทาน "คำแนะนำ" ที่นำเสนอโดย DMVs ดัชนีที่หายไป ฯลฯ

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


3

อีกเล็กน้อยหนึ่งในนัยของคำตอบของโทมัส:

เขาพูดว่า:

แน่นอนว่าคุณสามารถกำหนดดัชนีทั้งสามนี้เพื่อจัดการกับแต่ละประเภทแบบสอบถามตัวอย่างได้ แต่จะเกิดคำถามว่าการบำรุงรักษาที่จะต้องปรับปรุงดัชนีเหล่านี้ (คิดว่า: INSERTs, UPDATEs, DELETEs) นั่นคือค่าใช้จ่ายของดัชนี

ดังนั้นคำถามสำคัญอีกข้อหนึ่งก็กลายเป็น: ตารางมีการปรับปรุงบ่อยเพียงใด

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

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

ตัวพิมพ์กลางอาจเป็นตารางที่โดยปกติแล้วจะอัปเดตเฉพาะในกระบวนการแบทช์ในชั่วข้ามคืน การอัปเดตการชะลอตัวของดัชนีหลายรายการจะไม่ส่งผลต่อประสิทธิภาพในเวลากลางวันโดยจะมีผลต่อ (1) เวลาที่ใช้ในการเรียกใช้การบำรุงรักษาเป็นกลุ่มทุกคืน (2) ประสิทธิภาพของกระบวนการที่เกิดขึ้นพร้อมกันและ (3) เวลาสำหรับ งานบำรุงรักษาฐานข้อมูลเช่นการจัดโครงสร้างดัชนีใหม่ ดังนั้นตราบใดที่โพรเซสใน 3 arenas นั้นรันเร็วพอสำหรับคุณ ... สร้างดรรชนีที่เร่งความเร็วเคียวรี

HTH ...

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