Необходим ли первичный ключ в SQL Server? - PullRequest
51 голосов
/ 11 августа 2010

Это может быть довольно наивный и глупый вопрос, но я все равно его задам

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

Доступ к этой таблице осуществляется через неуникальные поля регулярно, но пользовательский SP или данные доступа к процессу не обрабатываются с помощью первичного ключа. Нужен ли первичный ключ? Это используется за кулисами? Повлияет ли это на производительность положительно или отрицательно?

Ответы [ 10 ]

43 голосов
/ 11 августа 2010

Необходимый? Используется за кадром? Что ж, он сохраняется на диске и хранится в кэше строк и т. Д. Удаление немного увеличит вашу производительность (используйте часы с точностью до миллисекунды, чтобы заметить).

Но ... в следующий раз, когда кому-то понадобится создать ссылки на эту таблицу, они вас проклянут Если они смелы, они добавят PK (и долго ждут, пока БД создаст столбец). Если они не смелы или глупы, они начнут создавать ссылки, используя бизнес-ключ (то есть столбцы данных), что приведет к кошмару обслуживания.

Вывод: поскольку стоимость наличия ПК (даже если он не используется банкоматом) очень мала, пусть будет так.

13 голосов
/ 11 августа 2010

Есть ли у вас какие-либо внешние ключи, вы когда-нибудь присоединялись к ПК?

Если ответ на этот вопрос отрицательный, и ваше приложение никогда не получает элемент из таблицы по его ПК, и никакой запрос никогда не выполняется.использует его в предложении where, поэтому вы просто добавили столбец IDENTITY, чтобы иметь PK, затем:

  • PK сам по себе не добавляет значения, но не наносит ущерба либо
  • тот факт, что PK, скорее всего, кластеризованный индекс тоже является .. это зависит .

Если у вас есть NC-индексы, то факт, что у вас есть узкий искусственный кластерный ключ (IDENTITY PK) помогает поддерживать узость этих индексов (ключ CDX воспроизводится в каждом слоте листа NC).Таким образом, PK, даже если он никогда не используется, полезен, если у вас есть существенные индексы NC.

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

И, наконец, если к таблице редко обращаются, но часто пишут, то она может быть хорошим кандидатом на HEAP (без кластеризованного ключа вообще), поскольку кучи намного лучше при вставках.См. Сравнение таблиц, организованных с кластерными индексами, с кучами .

5 голосов
/ 11 августа 2010

Первичный ключ находится за сценой clustered index (по умолчанию, если не генерируется как некластеризованный индекс) и содержит все данные для таблицы.Если PK является столбцом идентификаторов, вставки будут происходить последовательно, и разделение страниц не произойдет.

Но если вы вообще не обращаетесь к столбцу id, то, возможно, вы захотите добавить некоторые индексы в другие столбцы.Также, когда у вас есть PK, вы можете настроить отношения FK

4 голосов
/ 12 августа 2010

В логической модели таблица должна иметь хотя бы один ключ.Нет оснований произвольно указывать, что один из ключей является «первичным»;все ключи равны.Хотя понятие «первичный ключ» можно проследить до ранней работы Теда Кодда, ошибка, обнаруженная на ранних этапах, уже давно исправлена ​​в теории отношений.

К сожалению, PRIMARY KEY нашел свой путь в SQL, и с тех пор нам приходилось с этим мириться.Таблицы SQL могут иметь повторяющиеся строки, и, если вы считаете, что набор результатов запроса SELECT также является таблицей, то в таблицах SQL также могут быть строки с дублированием.Реляционные теоретики очень не любят SQL.Тем не менее, только потому, что SQL позволяет вам делать всякие дурацкие нереляционные вещи, это не значит, что вы должны их делать.Рекомендуется, чтобы каждая таблица SQL имела хотя бы один ключ.

В SQL использование PRIMARY KEY само по себе имеет последствия, например NOT NULL, UNIQUE, ссылка таблицы по умолчанию для внешних ключей.,В SQL Server использование PRIMARY KEY само по себе имеет последствия, например, кластеризованный индекс таблицы.Однако во всех этих случаях неявное поведение можно сделать явным, используя специальный синтаксис.

Вы можете использовать UNIQUE (ограничение, а не индекс) и NOT NULL в комбинации для принудительного применения ключей в SQL.Следовательно, нет, первичный ключ (или даже PRIMARY KEY) не требуется в SQL Server.

3 голосов
/ 11 августа 2010

У меня никогда не было бы таблицы без первичного ключа.Предположим, вам когда-нибудь понадобится удалить дубликат - как вы определите, какой из них удалить, а какой оставить?

1 голос
/ 11 августа 2010

Первичный ключ на самом деле является свойством модели вашего домена и уникальным образом идентифицирует экземпляр объекта домена.

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

У меня должна быть очень веская причина для создания таблицы без первичного ключа.

1 голос
/ 11 августа 2010

ПК не требуется.

Но вам следует рассмотреть возможность размещения неуникального индекса в столбцах, которые вы используете для запросов (т. Е. Появляются в предложении WHERE). Это значительно повысит производительность поиска.

1 голос
/ 11 августа 2010

Первичный ключ, когда он определен, поможет повысить производительность в базе данных для индексации и связей.

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

0 голосов
/ 11 августа 2010

Как сказал SQLMenace, кластерный индекс является важным столбцом для физической структуры таблицы.Кроме того, наличие кластеризованного индекса, особенно хорошо выбранного в тощем столбце, например целого числа pk, фактически увеличивает производительность вставки.

0 голосов
/ 11 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...