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 col1menyimpan nilai yang diurutkan col1bersama 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 col1akan diurutkan secara menurun, tetapi nilai di pkdalam setiap nilai col1akan diurutkan secara menaik.
Artinya query berikut ini:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
dapat dilayani ix_mytable_col1_desctetapi tidak oleh ix_mytable_col1.
Dengan kata lain, kolom yang membentuk a CLUSTERED INDEXdi tabel mana pun selalu merupakan kolom tertinggal dari indeks lain di tabel tersebut.