первичный ключ и индекс sql



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



причина, по которой я спрашиваю, заключается в том, что в MS SQL Server я могу создать индекс для этого идентификатора, который, как я уже сказал, является моим первичным ключом.



Edit: дополнительный вопрос - будет ли вред дополнительно индексировать первичный ключ?

906   10  

10 ответов:

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

дополнительный индекс не приносит пользы, но единственный вред (очень маленький)-это дополнительный размер файла и накладные расходы на создание строк.

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

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

например, у вас есть таблица со многими столбцами, но вы только запрашиваете Столбцы ID, Name и Address. Принимая ID в качестве первичного ключа, мы можем создать следующий индекс, который построен на ID, но включает в себя столбцы Name и Address.

CREATE NONCLUSTERED INDEX MyIndex
ON MyTable(ID)
INCLUDE (Name, Address)

Итак, когда вы используете этот запрос:

SELECT ID, Name, Address FROM MyTable WHERE ID > 1000

SQL Server даст вам результат только с помощью индекса, который вы создали, и он ничего не будет читать из фактической таблицы.

Примечание: этот ответ относится к разработке корпоративного класса в-большой.

Это проблема СУБД, а не только SQL Server, и поведение может быть очень интересным. Во-первых, хотя первичные ключи обычно индексируются автоматически (уникально), они не являются абсолютными. бывают случаи, когда важно, чтобы первичный ключ не был однозначно индексирован.

в большинстве РСУБД, уникальный индекс будет автоматически создан на первичном ключе если он еще не существует. Поэтому вы можете создать свой собственный индекс для столбца первичного ключа перед объявлением его в качестве первичного ключа, а затем этот индекс будет использоваться (если это допустимо) компонентом database engine при применении объявления первичного ключа. Часто можно создать первичный ключ и разрешить создание его уникального индекса по умолчанию, затем создать собственный альтернативный индекс для этого столбца, а затем удалить индекс по умолчанию.

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

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

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

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

можно определить первичный ключ в SQL Server 2012 с помощью среды SQL Server Management Studio или Transact-SQL. При создании первичного ключа автоматически создается соответствующий уникальный, кластеризованный или некластеризованный индекс.

http://technet.microsoft.com/en-us/library/ms189039.aspx

PK станет кластеризованным индексом, если вы не укажете некластеризованный

вот отрывок из MSDN:

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

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

Ну в SQL Server, как правило, первичный ключ автоматически индексируется. Это верно, но это не гарантирует более быстрого запроса. Первичный ключ даст вам отличную производительность, когда есть только 1 поле в качестве первичного ключа. Но, когда есть несколько полей в качестве первичного ключа, то индекс основан на этих полях.

например: Поля A, B, C являются первичным ключом, поэтому при выполнении запроса на основе этих 3 полей в предложении WHERE производительность хорошая, Но когда вы хотите чтобы запросить только поле C в предложении WHERE, вы не получите хорошую производительность. Таким образом, чтобы получить вашу производительность и работает, вам нужно будет индексировать поле C вручную.

большую часть времени вы не увидите проблему, пока не достигнете более 1 миллиона записей.

У меня есть огромная база данных без (отдельных) индекса.

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

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

вы можете создавать дополнительные индексы с помощью ПК в зависимости от вашего использования

  • индекс zip_code, id может быть полезно, если вы часто выбираете по zip_code и id

Comments

    Ничего не найдено.