Согласно Документации SQL Server часть создания первичного ключа включает в себя создание уникального индекса для этой же таблицы.
При создании ограничения PRIMARY KEY, уникальногоИндекс столбца или столбцов создается автоматически.По умолчанию этот индекс кластеризован;однако вы можете указать некластеризованный индекс при создании ограничения.
Когда уникальный индекс не для таблицы, каждая строка получает то, что документы называют "uniqueifier""длиной 4 байта (или ~ 2,14 миллиарда комбинаций)
Если кластерный индекс не создается со свойством UNIQUE, компонент Database Engine автоматически добавляет 4-байтовый столбец уникализатора в таблицу.Когда это требуется, компонент Database Engine автоматически добавляет значение уникализатора в строку, чтобы сделать каждый ключ уникальным.Этот столбец и его значения используются внутренне и не могут быть просмотрены или доступны пользователям.
Из этой информации и вашего сообщения об ошибке мы можем сказать две вещи:
- Существуеткластеризованный индекс в таблице
- В таблице нет первичного ключа
Учитывая объем данных, с которыми вы имеете дело, держу пари, у вас есть Clustered Columnstore Index для таблицы, которая в SQL Server 2014 не может включать первичный ключ.
Одним из возможных решений является разбиение table_b
на основе определенного значения столбца (которое имеет менее 15K уникальных значений на основании ограничений, указанных в документации ).Напомним, что одно и то же усилие по разделению может оказать значительное влияние на минимизацию времени выполнения любых запросов с использованием table_b
в зависимости от того, какой столбец используется в функции разделения.