2009-03-16 6 views
19

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

+0

Нет, вы должны ** не ** создавать его как 'desc'. В итоге вы получите много логической фрагментации из вставок [как показано здесь] (http://stackoverflow.com/a/9382500/73226) –

ответ

30

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

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

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

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

3

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

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

+3

С одним индексом столбца это не имеет значения, но ASC и DESC вступают в игру когда у вас есть несколько столбцов в индексе, а порядок имеет значение для второго/третьего/четвертого/etc столбца. –

+0

Это не имеет никакого смысла для меня. Если у вас есть два значения полей, то, как вы спускаетесь на дерево, совершенно безразлично. Это просто догадка, или у вас есть ссылка? – dkretz

+0

Имеет смысл для меня. Если у вас есть индекс, объявленный 'A ASC, B DESC', но большинство ваших запросов:' ORDER BY A ASC, B ASC', который не собирается избегать сортировки. –

Смежные вопросы