เหตุผลหนึ่งที่ชอบ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อยู่ในINCLUDEclause เนื่องจากไม่มีประโยชน์ที่จะมีในส่วนต้นไม้ของดัชนี
กรอไปข้างหน้าบางปี
คุณต้องปรับแต่งคำถามนี้:
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_colCol1
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