Да.
Когда вы устанавливаете первичный ключ (или любой индекс), вы можете определить это
ALTER TABLE dbo.[Messages] ADD CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED
(
msg_for ASC, msg_from ASC, msg_id DESC
)
SQL Server может сканировать в любом направлении, поэтому имеет смысл, если вы хотите управлять комбинацией порядка сортировки для нескольких столбцов.
Редактировать: Вы говорите в комментариях, что проблемный запрос
select top 10 msg_id
from message_user
where msg_for = @user_name
and msg_from <> @user_name
order by msg_id DESC
Проблема здесь не в восходящем, нисходящем.
Чтобы привести аналогию. Телефонные книги перечислены по фамилии, по порядку имен, но если вам необходимо узнать последние 10 лексикографических имен в каталоге, вам нужно будет отсканировать всю книгу. Это было бы неизбежно независимо от того, были ли имена в каждом разделе перечислены в порядке возрастания или убывания.
Аналогично, составные индексные ключи должны быть msg_for, msg_id, msg_from
, чтобы оптимально удовлетворить этот запрос, а не msg_for, msg_from, msg_id
При этом последнем порядке все равно потребуется сканировать весь раздел индекса, удовлетворяющий критериям msg_for = @user_name
, поскольку он не может знать если будет еще более позднее msg_id
, принадлежащее более позднему msg_from
Кроме того, независимо от того, в каком направлении msg_id
отсортировано в их отдельных подразделах, для последовательного сканирования части msg_for = @user_name
индекса все равно потребуется сортировать их как фрагментированные, находясь в подразделах согласно msg_from
.