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 mengurutkan dengan kedua cara.
Lihat artikel di blog saya untuk detailnya:
Memperbarui:
Faktanya, ini bisa menjadi masalah bahkan untuk indeks kolom tunggal, meskipun tidak begitu jelas.
Bayangkan sebuah indeks pada kolom tabel yang dikelompokkan:
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 diurutkan 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 (col1, pk)
, dan kueri ini:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
tidak perlu disortir.
Jika kita membuat index sebagai berikut:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, maka nilai col1
akan diurutkan secara menurun, tetapi nilai di pk
dalam setiap nilai col1
akan diurutkan secara menaik.
Artinya query berikut ini:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
dapat dilayani ix_mytable_col1_desc
tetapi tidak oleh ix_mytable_col1
.
Dengan kata lain, kolom yang membentuk a CLUSTERED INDEX
di tabel mana pun selalu merupakan kolom tertinggal dari indeks lain di tabel tersebut.