สิ่งนี้สำคัญที่สุดเมื่อใช้กับดัชนีคอมโพสิต:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
สามารถใช้ได้ทั้ง:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
หรือ:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
แต่ไม่ใช่สำหรับ:
SELECT *
FROM mytable
ORDER BY
col1, col2
ดัชนีในคอลัมน์เดียวสามารถใช้อย่างมีประสิทธิภาพสำหรับการเรียงลำดับทั้งสองวิธี
ดูบทความในบล็อกของฉันสำหรับรายละเอียด:
ปรับปรุง:
ในความเป็นจริงสิ่งนี้อาจมีความสำคัญสำหรับดัชนีคอลัมน์เดียวแม้ว่าจะไม่ชัดเจนก็ตาม
ลองนึกภาพดัชนีในคอลัมน์ของตารางคลัสเตอร์:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
ดัชนีการcol1
เก็บค่าสั่งซื้อcol1
พร้อมกับการอ้างอิงไปยังแถว
pk
ตั้งแต่ตารางคลัสเตอร์อ้างอิงถึงแถวเป็นจริงค่าของ col1
พวกเขาจะได้รับคำสั่งยังอยู่ในค่าของแต่ละ
ซึ่งหมายความว่าจะมีการสั่งให้ออกจากดัชนีจริง ๆ(col1, pk)
และแบบสอบถามนี้:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
ไม่ต้องการเรียงลำดับ
ถ้าเราสร้างดัชนีดังต่อไปนี้:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
จากนั้นค่าของcol1
จะเรียงลำดับจากมากไปน้อย แต่ค่าของpk
ภายในแต่ละค่าของcol1
จะเรียงลำดับจากน้อยไปมาก
ซึ่งหมายความว่าแบบสอบถามต่อไปนี้:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
สามารถเสิร์ฟแต่ไม่ได้โดยix_mytable_col1_desc
ix_mytable_col1
กล่าวอีกนัยหนึ่งคอลัมน์ที่ประกอบขึ้นเป็นCLUSTERED INDEX
ตารางใด ๆ จะเป็นคอลัมน์ต่อท้ายของดัชนีอื่น ๆ ในตารางนั้นเสมอ