2009-06-25 1 views
17

Если у меня есть таблица SQL Server с кластеризованным индексом в поле datetime, то перед вставками она должна быть установлена ​​DateTime.Now (начиная с C#), если индекс будет возрастать или опускаться, чтобы избежать реорганизации таблицы?SQL Server: кластерный индекс в datetime, ASC или DESC

Спасибо.

ответ

27

На самом деле не имеет значения - но является ли DateTime действительно уникальным? Я бы не выбрал кластеризованный индекс только для DateTime - вместо этого я использовал бы идентификатор INT IDENTITY или BIGINT IDENTITY и поместил бы обычный некластеризованный индекс в DateTime (так как это действительно не гарантировано быть уникальным ......)

Марк

PS: Как первичный ключ, общий консенсус в отношении того, что кластерный ключ должен быть является:

  • уникального (в противном случае SQL Server будет «uniquify» его, добавив 4- байтовый уникальный идентификатор)
  • как узкий как можно
  • статического (никогда не меняются)
  • когда увеличивающейся

Колонка (ы), которые составляют кластерный ключ (в том числе, что 4 байта uniqueifier) ​​добавляются КАЖДЫЙ ВХОД В КАЖДЫЙ некластеризованный индекс - так что вы хотите, чтобы они были как можно более тонкими.

PS 2: кластерный ключ (ключи) добавляются к каждому некластеризованному индексу, потому что именно так SQL Server будет извлекать целые строки после того, как он найдет значение поиска в некластеризованном индексе. Это так называемое «местоположение» в базе данных, так сказать. Поэтому он должен быть уникальным и узким.

+0

Таким образом, кластеризованный индекс должен быть уникальным? – Eyvind

+4

Если это * НЕ * уникально, тогда SQL Server автоматически добавит 4-байтовый «уникальный идентификатор» - если это вообще возможно, постарайтесь избежать этого! –

+1

Спасибо, не знал этого. Итак, учитывая, что в рассматриваемой таблице есть PK, который является уникальным идентификатором, было бы лучше создать кластерный индекс в поле datetime и PK? – Eyvind

5

Читать эту http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx

Если прочитать часто на основе даты и времени поля, хороший выбор является составной ключ даты и идентичности - в этом порядке (дата, личность).

+3

Я не могу подчеркнуть, насколько полезным может быть фактическое использование DateTime в качестве первого поля в составном кластерном ключе. Это может не совпадать с идеальной моделью, всегда имеющей идентификатор int, но когда вы постоянно запрашиваете, скажем, записи журнала за последние 1 час, проблема сводится к тому, что DateTime является частью первичного ключа. Особенно, если ваше поле DateTime менее 95% выборочно (что означает множество не уникальных значений), то, как вы собираетесь попасть в индекс и получить свою производительность, чего вы ожидаете. – AndyClaw