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.