Первичный ключ Ascending vs Descending - PullRequest
25 голосов
/ 16 марта 2009

В Sql Server у меня есть таблица с первичным ключом Identity. Часто мне нужны последние несколько новых записей, поэтому я выбираю Top n, отсортированный по убыванию первичного ключа. Должен ли я определять индекс первичного ключа как нисходящий, или это не имеет значения? т.е. если они в порядке возрастания, то может ли sql так же эффективно работать в обратном направлении?

Ответы [ 2 ]

36 голосов
/ 16 марта 2009

С чисто запрашивающей точки зрения не имеет значения, будет ли ваш ключ нисходящим или восходящим, если вы хотите получить N самых последних или N самых старых записей:

Внутренние алгоритмы SQL Server могут одинаково эффективно перемещаться в обоих направлениях по индексу, состоящему из одного столбца, независимо от последовательности, в которой хранятся ключи. Например, указание DESC для индекса из одного столбца не приводит к тому, что запросы с предложением ORDER BY IndexKeyCol DESC выполняются быстрее, чем если бы для индекса был задан ASC.

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

Однако практически при любых обычных обстоятельствах вы хотите, чтобы ваш первичный ключ был восходящим и обычно последовательным для предотвращения фрагментации . SQL Server оптимизирован для физического добавления новых записей в конец файла базы данных. Если ему нужно будет вставлять каждую новую запись сверху и опускать все вниз, это, вероятно, приведет к почти 100% фрагментации.

4 голосов
/ 16 марта 2009

Это не имеет абсолютно никакого значения.

Я даже не представляю, почему можно так или иначе объявить.

...