order by case when priority is null then 1 else 0 end, priority
Это в первую очередь имеет значение при использовании с составными индексами:
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,
Порядок сортировки имеет значение, когда вы хотите получить множество отсортированных данных, а не отдельные записи.
Обратите внимание, что (как вы предполагаете в своем вопросе) порядок сортировки обычно гораздо менее важен, чем то, какие столбцы вы индексируете (система может считывать индекс в обратном порядке, если порядок противоположен желаемому). Я редко задумываюсь о порядке сортировки индекса, в то время как меня мучают столбцы, охватываемые индексом.
@Quassnoi предоставляет отличный пример того, когда имеет значение .