Ini terutama penting bila digunakan dengan indeks komposit:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
dapat digunakan untuk:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
atau:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, tetapi tidak untuk:
SELECT *
FROM mytable
ORDER BY
col1, col2
Indeks pada satu kolom dapat digunakan secara efisien untuk menyortir dalam dua cara.
Lihat artikel di blog saya untuk detailnya:
- Indeks menurun
Pembaruan:
Faktanya, ini bisa menjadi masalah bahkan untuk indeks kolom tunggal, meskipun tidak begitu jelas.
Bayangkan sebuah indeks pada kolom tabel berkerumun:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Indeks pada col1 menyimpan nilai yang dipesan dari col1 bersama dengan referensi ke baris.
Karena tabel dikelompokkan, referensi ke baris sebenarnya adalah nilai dari pk . Mereka juga diurutkan dalam setiap nilai col1 .
Ini berarti bahwa daun indeks sebenarnya diurutkan pada (col1, pk) , dan kueri ini:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
tidak perlu disortir.
Jika kita membuat indeks sebagai berikut:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, lalu nilai col1 akan diurutkan secara menurun, tetapi nilai pk dalam setiap nilai col1 akan diurutkan secara menaik.
Artinya query berikut:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
dapat dilayani oleh ix_mytable_col1_desc tetapi tidak dengan ix_mytable_col1 .
Dengan kata lain, kolom yang membentuk CLUSTERED INDEX di tabel mana pun selalu merupakan kolom akhir dari indeks lain di tabel itu.