2009-09-24 2 views
8

Я довольно хорошо разбираюсь в производительности SQL-сервера, но мне постоянно приходится обсуждать идею о том, что GUID следует использовать в качестве типа по умолчанию для Clusterd Primary Keys.Использование GUID в первичных ключах/индексированных индексах

Предполагая, что таблица имеет довольно низкое количество вставок в день (5000 +/- ряды/день), какие проблемы с производительностью мы могли бы столкнуться? Как раскол страницы влияет на нашу эффективность поиска? Как часто мне нужно переиндексировать (или я должен дефрагментировать)? Что я должен установить коэффициенты заполнения (100, 90, 80, ect)?

Что делать, если я вставлял 1 000 000 строк в день?

Прошу прощения за все вопросы, но я ищу, чтобы получить резервную копию, не использующую GUID как наш стандарт по умолчанию для ПК. Тем не менее я полностью открыт, чтобы изменить свой разум за счет перегружающихся знаний из базы данных StackOverflow.

+0

Возможно, дубликат http://stackoverflow.com/questions/821108/clustered-non-clustered-index-on-unique-identifier-column-in-sql-server? –

+0

Наиболее определенно похожи, но я ищу некоторые особенности - то, что может быть использовано для будущих искателей айнсера. – NTDLS

ответ

8

Если вы делаете какой-либо объем, идентификаторы GUID очень плохи, как плохой ПК, если вы не используете sequential GUIDs по конкретным причинам, которые вы описываете. Page fragmentation is severe:

    Average     Average 
       Fragmentation Fragment Fragment Page  Average 
Type    in Percent  Count  Size  Count Space Used 

id    4.35   7   16.43  115  99.89 
newidguid  98.77   162   1   162  70.90 
newsequentualid 4.35   7   16.43  115  99.89 

И как this comparison между GUIDs и целыми числами показывает:

Тест1 вызвало огромное количество разбиений страниц, и имел плотность сканирования вокруг 12%, когда я управлял DBCC SHOWCONTIG после того, как вставки завершены. Таблица Test2 имела плотность сканирования около 98%

Если ваш объем очень низок, однако это не имеет большого значения.

Если вам действительно нужен уникальный глобальный идентификатор, но он имеет большой объем (и не может использовать последовательные идентификаторы), просто поместите идентификаторы GUID в индексированный столбец.

+0

Этот подкаст содержит хороший разговор о проблемах непоследовательных GUID в качестве первичных ключей http://www.dotnetrocks.com/default.aspx?showNum=455. –

+0

Средняя используемая площадь кажется нисходящей .... – RCIX

+0

Извините за это, но эта ссылка не работает. – zer09

2

Недостатками использования GUID в качестве первичного ключа:

  • Нет смысла заказа, средства индексации не дает прирост производительности, как это делает с целым числом.
  • Размер GUID 16 байт по сравнению с 2, 4 или 8 байтами для целого числа.
  • Очень сложно людям запомнить, поэтому ничего хорошего в качестве ссылочного идентификатора.

Преимущества:

  • разрешающие не-угадываемы первичные ключи, следовательно, что может быть менее опасным, когда отображается в строке запроса веб-страницы или в приложении.
  • Полезно в Базах данных, которые не предоставляют автоматический прирост или тип данных идентификации.
  • Полезно, если вам необходимо объединить данные между двумя несопоставимыми источниками данных на разных платформах или в средах.

Я думал, что решение относительно использования GUID было довольно простым, но, возможно, я не знаю других проблем.

+1

GUID важны как идентификаторы, когда наборы данных или частичные наборы данных могут быть объединены из разрозненных источников. –

+0

@Rex, хороший момент, я добавил это как преимущество. – Ash

+0

В бывшей компании: мы управляли веб-службами по уходу за детьми, и многие из компаний, которые были в разных базах данных, сливались и покупали один из них. Ведущий разработчик определил GUID для ПК, которые сделали слияние компаний Чрезвычайно простыми. Он howerver вышел из бизнеса после того, как не смог пройти тесты от LoadRunner (100% -ый процессор при сканировании/поиске индексов). Abysmal performance ... – NTDLS

1

С такими низкими вставками в день я сомневаюсь, что разделение страницы должно быть значительным фактором. Реальный вопрос заключается в том, как 5000 сравнивается с существующим числом строк, поскольку это будет основной информацией, необходимой для принятия решения о соответствующем начальном коэффициенте заполнения для дефиса.

Это говорит о том, что я лично не большой поклонник GUID. Я понимаю, что они могут хорошо служить в некоторых контекстах, но во многих случаях они просто «на пути» [эффективности, простоты использования, ...]

Я нахожу следующие вопросы, которые необходимо сузить решая, следует ли использовать GUID или нет.

  • Будет ли публикация ПК/опубликована? (Т.е. она будет использоваться за пределами его внутреннего использования в SQL, будут приложениям нужны эти ключи в несколько персистирующей моде? Будут ли как-то увидеть пользователей этих ключи?
  • Может PK быть использована, чтобы помочь объединить разрозненные источники данных?
  • Имеет ли таблица первичный -возможно составленный из столбцов (ов) в данных? Каков размер этого возможного этого ключа
  • Как сортируются первичные ключи?Если композитный, являются ли первые несколько столбцов выборочными?
0

Использование указателя (если это не последовательный GUID), поскольку кластерный индекс будет убивать производительность вставки. Поскольку расположение физической таблицы выравнивается в соответствии с кластерным индексом, использование указателя, который имеет случайный порядок упорядочения, приведет к серьезной фрагментации таблицы. Если вы хотите использовать указатель в качестве индекса PK/Clustered, он должен быть последовательным указателем, использующим функцию newsequentialid() в SQL-сервере. Это гарантирует, что сформированные направляющие упорядочены последовательно и предотвращают фрагментацию.

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