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