ПРИМЕЧАНИЕ. Этот ответ касается разработки корпоративного класса в целом .
Это проблема СУБД, а не только SQL Server, и ее поведение может быть очень интересным. С одной стороны, хотя для первичных ключей характерно автоматическое (уникальное) индексирование, это НЕ является абсолютным. Бывают случаи, когда важно, чтобы первичный ключ НЕ был однозначно проиндексирован.
В большинстве РСУБД для первичного ключа автоматически создается уникальный индекс , если он еще не существует . Следовательно, вы можете создать свой собственный индекс для столбца первичного ключа, прежде чем объявить его в качестве первичного ключа, тогда этот индекс будет использоваться (если это допустимо) механизмом базы данных при применении объявления первичного ключа. Часто вы можете создать первичный ключ и разрешить создание его уникального индекса по умолчанию, затем создать собственный альтернативный индекс для этого столбца и затем удалить индекс по умолчанию.
Теперь самое интересное - когда вам НЕ нужен уникальный индекс первичного ключа? Вы не хотите, и не можете терпеть, когда ваша таблица получает достаточно данных (строк), чтобы сделать обслуживание индекса слишком дорогим. Это зависит от аппаратного обеспечения, механизма СУБД, характеристик таблицы и базы данных и загрузки системы. Однако обычно он начинает проявляться, когда таблица достигает нескольких миллионов строк.
Существенная проблема заключается в том, что каждая вставка строки или обновления столбца первичного ключа приводит к сканированию индекса для обеспечения уникальности. Это уникальное сканирование индекса (или его эквивалент в любой СУБД) становится намного дороже по мере роста таблицы, пока оно не доминирует над производительностью таблицы.
Я много раз сталкивался с этой проблемой с таблицами размером до двух миллиардов строк, 8 ТБ памяти и сорока миллионов вставок строк в день. Передо мной была поставлена задача реорганизовать систему, которая включала в себя удаление уникального индекса первичного ключа практически на первом этапе Действительно, падение этого индекса было необходимо в производстве, чтобы просто восстановиться после сбоя, прежде чем мы даже приблизились к перепроектированию. Это изменение включало в себя поиск других способов обеспечить уникальность первичного ключа и обеспечить быстрый доступ к данным.