Влияние использования GUID на SQL Server

Я попытался найти это, прежде чем спрашивать, но каждый найденный мной результат упоминает GUID как ПК, что здесь не так.

У меня есть база данных, использующая INT как PK для всех таблиц. Однако доступ к данным осуществляется через вызовы API, и требовалось, чтобы значение INT не возвращалось или не использовалось ни в каком API. Поэтому я думал о наличии дополнительного столбца в таблицах, содержащих GUID.

Теперь мой вопрос: если я проиндексирую столбец GUID, какое влияние на производительность будет иметь это влияние? Будет ли это положительным или отрицательным? Помните, что GUID не является ПК или FK.

Я думаю, что ты на правильном пути, но не принимай это от меня …

В разделе комментариев к одной из статей Кимберли Триппа она отвечает на комментарий, который защищает противоположность вашей позиции, и она не согласна и утверждает то же самое решение, которое вы предлагаете (некластерный индексированный указатель с кластеризованным первичным ключом int / bigint).

Герман:

Если GUID является внутренним идентификатором для моделируемого объекта (т. Е. Используется по выбору), то это должен быть кластерный первичный ключ без вопросов. Причина заключается в том, что добавление суррогатного ключа идентификации (int или bigint) и понижение первичного ключа GUID столбцу с индексом / уникальным ограничением требует, чтобы 2 индекса поддерживались и замедлялись, по моему опыту, в 2 раза.


Кимберли Трипп

Эй, Герман. Вообще-то, я не согласен. Для точечных запросов с использованием некластеризованного индекса не добавляется значительная сумма дорогостоящих ИО. И поддержание некластеризованного индекса, который сильно фрагментирован, намного дешевле, чем требуемое обслуживание на сильно фрагментированном кластерном индексе. Кроме того, GUID может сделать ваши некластеризованные индексы излишне широкими – заставляя их брать: больше места в журналах, больше места на диске, больше кеша, а также добавлять время на вставку и доступ (особенно в больших запросах / объединениях).

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

Ура,
kt ~ GUID как ОСНОВНЫЕ КЛЮЧИ и / или ключ кластеризации – Kimberly L. Tripp

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

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

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

  • Выбор правильной структуры
  • Как получить данные в внешнем ключе SQL Server с помощью asp.net?
  • Удаление всех объектов в таблице
  • Заполнение многосегментного списка с данными MVC 3 .NET
  • Разница между СУБД и СУБД
  • Перемещение Entity Framework (EF) в зависимости от версии SQL Server
  • EF6 с IdentityDbContext для многих недопустимых имен столбцов
  • База данных Windows Azure SQL - Столбец Auto Increance Identity пропускает значения
  • локальная синхронизация базы данных между базой данных SQL Server и локальной базой данных sql ce
  • Маршрутизация OData с сохраненной процедурой EF6
  • Пространственный тип Entity Framework Core SQL Server
  • Interesting Posts

    C # cmd.ExecuteScalar (): «Невозможно продолжить выполнение, потому что сеанс находится в состоянии kill».

    OUTER APPLY условно передает значения в функцию

    хранятся процедуры быстрее, чем функции или нет

    Как я могу использовать приложение Case в CTE tsql?

    Как преобразовать огромные XML-файлы в реляционные данные для выполнения запросов

    SSRS форматирует цвета строк на основе значений атрибутов

    t-sql: динамически фильтровать XML на нескольких условиях?

    Добавить «-» вместо пробелов в списке

    Извлечение элементов из XML в SQL

    Могут быть заблокированы в таблицах базы данных, что позволяет выполнять другие запросы

    Вставка со сложным упорядоченным групповым счетчиком

    Как изменить строку соединения в пакете DTS во время выполнения из приложения .NET?

    Создание базы данных из файла резервной копии с использованием C # на удаленном SQL Server

    может ли dacpac использоваться для управления базами данных с большим объемом данных?

    Обновить столбец int в таблице с уникальными значениями приращения

    Давайте будем гением компьютера.