Повышение производительности первичного ключа GUID индекса кластера

У меня есть таблица с большим количеством строк (10K +), и ее первичным ключом является GUID. Первичный ключ кластеризован. Производительность запроса в этой таблице довольно низкая. Пожалуйста, внесите предложения, чтобы сделать его эффективным.

Ответов (6)

Решение

Вместо этого вам нужно использовать newsequentialid (), см. Здесь Простой код, чтобы показать разницу между Newid и Newsequentialid

Избегайте создания кластерного индекса для столбцов с длинными строками. GUID будет состоять из 36 символов. Это снизит производительность запросов, даже если вы создали кластерный индекс. для лучшей практики используйте целочисленные столбцы идентификаторов.

Вы можете попробовать последовательные GUIDS, которые сделают индекс более эффективным. Информация здесь .

Кластеризованный индекс по GUID - не лучший вариант. Сама природа GUID такова, что он случайный, в то время как кластеризованный индекс физически упорядочивает записи по ключу. Эти две вещи полностью расходятся. Для каждой вставки SQL должен переупорядочивать записи на диске! Удалите кластеризацию из этого индекса!

Время использовать кластеризацию - это когда у вас есть «естественный» порядок данных: время вставки, номер счета и т. Д. Для полей времени кластеризация почти бесплатна. Для номера счета это может быть бесплатно или дешево (когда номера счетов присваиваются последовательно).

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

Вам необходимо проанализировать свой запрос. Мы можем только догадываться, почему ваши запросы плохо выполняются, не просматривая план выполнения (который вы можете легко избавиться от SQL Server или Oracle).

Учитывая, что GUID - это 128-битное значение (если оно хранится в исходном виде), GUID снижает плотность блоков данных и индекса на целых 50% (в случае индекса первичного ключа), поэтому убедитесь, что GUID подходит.

Но проблема может быть не в этом, поэтому просмотрите план запроса. Это могло быть несколько других проблем.

Нет проблем с использованием GUID в качестве первичного ключа. Просто убедитесь, что когда вы фактически устанавливаете GUID в качестве первичного ключа, тогда установите индекс, который он автоматически создает, как некластеризованный. Многие люди забывают (или не знают) сделать это в SQL Server.

НИКОГДА не используйте кластерный индекс для GUID. Это приведет к физическому упорядочиванию GUID на диске, что, очевидно, бессмысленно (как уже указывали другие).