Необходим ли первичный ключ в SQL Server?

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

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

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

52
задан roryok 18 October 2015 в 22:56
поделиться

10 ответов

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

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

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

45
ответ дан 7 November 2019 в 09:29
поделиться

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

3
ответ дан 7 November 2019 в 09:29
поделиться

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

0
ответ дан 7 November 2019 в 09:29
поделиться

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

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

1
ответ дан 7 November 2019 в 09:29
поделиться

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

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

5
ответ дан 7 November 2019 в 09:29
поделиться

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

0
ответ дан 7 November 2019 в 09:29
поделиться

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

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

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

1
ответ дан 7 November 2019 в 09:29
поделиться

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

К сожалению, 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 не нужен.

4
ответ дан 7 November 2019 в 09:29
поделиться

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

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

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

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

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

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

13
ответ дан 7 November 2019 в 09:29
поделиться

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

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

1
ответ дан 7 November 2019 в 09:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: