составной первичный ключ с использованием newid и newsequentialid - PullRequest
0 голосов
/ 09 января 2010

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

Как насчет составного первичного ключа с {newsequentialid (), newid ()}, чтобы новый GUID гарантированно был больше, чем сгенерированный ранее?

Есть ли здесь проблема с производительностью?

Вы можете подумать, зачем кому-то это делать, но я пишу правило анализа кода и не знаю, какие сумасшедшие вещи будут делать пользователи:)

Спасибо

1 Ответ

4 голосов
/ 09 января 2010

Это даже хуже, чем простой, единственный GUID, созданный с помощью просто newid ().

Почему ??

  • это все еще совершенно случайно (из-за части newid ()), вызывая массовую фрагментацию индекса
  • это вдвое больше, чем один GUID, что делает все ваши некластеризованные индексы более раздутыми и менее эффективными (32 байта против 4 байтов для INT IDENTITY)

Так что я бы порекомендовал либо:

  • придерживайтесь только newsequentialid () в качестве значения по умолчанию для вашего ПК, если вы действительно хотите и нуждаетесь в PK-стиле в GUID-стиле
  • использовать INT / BIGINT IDENTITY для оптимальной производительности (если репликация не требуется)

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

...