เหตุผลหนึ่งที่ชอบINCLUDE
มากกว่าคอลัมน์หลักหากคุณไม่ต้องการคอลัมน์นั้นในคีย์คือเอกสารประกอบ ทำให้การพัฒนาดัชนีง่ายขึ้นในอนาคต
พิจารณาตัวอย่างของคุณ:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
ดัชนีนั้นดีที่สุดหากคำค้นหาของคุณมีลักษณะดังนี้:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
แน่นอนคุณไม่ควรใส่คอลัมน์ลงไปINCLUDE
หากคุณจะได้รับประโยชน์เพิ่มเติมจากการมีคอลัมน์เหล่านั้นในส่วนสำคัญ แบบสอบถามทั้งสองต่อไปนี้ต้องการcol2
คอลัมน์ในคีย์ของดัชนี
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
สมมติว่านี่ไม่ใช่กรณีและเรามีcol2
อยู่ในINCLUDE
clause เนื่องจากไม่มีประโยชน์ที่จะมีในส่วนต้นไม้ของดัชนี
กรอไปข้างหน้าบางปี
คุณต้องปรับแต่งคำถามนี้:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
เพื่อเพิ่มประสิทธิภาพการค้นหานั้นดัชนีต่อไปนี้จะดีมาก:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
หากคุณตรวจสอบว่าคุณมีดัชนีใดในตารางนั้นดัชนีก่อนหน้านี้ของคุณอาจยังอยู่ที่นั่น:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
ตอนนี้คุณรู้แล้วCol2
และCol3
ไม่ได้เป็นส่วนหนึ่งของแผนภูมิดัชนีและไม่ได้ใช้เพื่อ จำกัด ช่วงดัชนีการอ่านหรือสำหรับการเรียงลำดับแถว ค่อนข้างปลอดภัยที่จะเพิ่มanother_column
ไปยังจุดสิ้นสุดของส่วนสำคัญของดัชนี (หลังจากcol1
) มีความเสี่ยงเล็กน้อยที่จะทำลายอะไร:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
ดัชนีนั้นจะมีขนาดใหญ่ขึ้นซึ่งยังคงมีความเสี่ยงอยู่บ้าง แต่โดยทั่วไปจะเป็นการดีกว่าที่จะขยายดัชนีที่มีอยู่เมื่อเทียบกับการแนะนำดัชนีใหม่
หากคุณจะมีดัชนีโดยไม่ต้องINCLUDE
คุณจะไม่สามารถรู้ว่าสิ่งที่คุณจะสอบถามทำลายโดยการเพิ่มทันทีหลังจากanother_col
Col1
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
จะเกิดอะไรขึ้นถ้าคุณเพิ่มanother_col
ระหว่างCol1
และCol2
? ข้อความค้นหาอื่น ๆ จะประสบหรือไม่
มี "ผลประโยชน์" อื่น ๆ ของมีINCLUDE
คอลัมน์คีย์เทียบกับถ้าคุณเพิ่มคอลัมน์เหล่านั้นเพียงเพื่อหลีกเลี่ยงการดึงข้อมูลออกจากตาราง อย่างไรก็ตามฉันคิดว่าเอกสารสำคัญที่สุด
ในการตอบคำถามของคุณ:
คุณจะแนะนำแนวทางใดในการพิจารณาว่าจะสร้างดัชนีการครอบคลุมโดยมีหรือไม่มีข้อ INCLUDE หรือไม่
หากคุณเพิ่มคอลัมน์ในดัชนีเพื่อจุดประสงค์เดียวที่จะให้คอลัมน์นั้นมีอยู่ในดัชนีโดยไม่ต้องไปที่ตารางให้วางไว้ในส่วนINCLUDE
คำสั่ง
หากการเพิ่มคอลัมน์ในคีย์ดัชนีจะก่อให้เกิดประโยชน์เพิ่มเติม (เช่นสำหรับorder by
หรือเพราะมันสามารถ จำกัด ช่วงดัชนีการอ่าน) ให้เพิ่มลงในคีย์
คุณสามารถอ่านการสนทนาที่ยาวขึ้นเกี่ยวกับเรื่องนี้ได้ที่นี่:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes