Я пытаюсь преобразовать таблицы из первичных ключей / кластерных индексов guid в int. Это для SQL Server 2005. Есть две таблицы MainTable
и RelatedTable
, и текущая структура таблицы выглядит следующим образом:
MainTable [40 миллионов строк]
IDGuid - uniqueidentifier - PK
-- [data columns]
RelatedTable [400 миллионов строк]
RelatedTableID - uniqueidentifier - PK
MainTableIDGuid - uniqueidentifier [foreign key to MainTable]
SequenceNumber - int - incrementing number per main table entry since there can be multiple entries related to a given row in the main table. These go from 1,2,3... etc for each MainTableIDGuid value.
-- [data columns]
Кластерный индекс для MainTable
в настоящее время является первичным ключом (IDGuid
). Кластерный индекс для RelatedTable
в настоящее время (MainTableIDGuid, SequenceNumber)
.
Я хочу, чтобы мое обращение сделало несколько вещей: <</p>
- Измените
MainTable
на использование целочисленного идентификатора вместо GUID
- Добавить столбец
MainTableIDInt
в связанную таблицу, которая ссылается на целочисленный идентификатор основной таблицы
- Измените первичный ключ и кластерный индекс с
RelatedTable
на (MainTableIDInt, SequenceNumber)
- Избавьтесь от направляющих столбцов.
Я написал скрипт для следующего:
- Добавить столбец
IDInt int IDENTITY
к MainTable
. Это делает перестройку таблицы и генерирует новые значения идентификатора идентификатора.
- Добавить столбец
MainTableIDInt int
к RelatedTable
.
Следующим шагом является заполнение столбца RelatedTable.MainTableIDInt
для каждой строки соответствующим значением MainTable.IDInt
[на основе соответствующих идентификаторов guid]. Это шаг, который я одержим. Я понимаю, что это не будет быстрым, но я бы хотел, чтобы он работал как можно лучше.
Я могу написать инструкцию SQL, которая делает это обновление:
UPDATE RelatedTable
SET RelatedTable.MainTableIDInt = (SELECT MainTable.IDInt FROM MainTable WHERE MainTable.IDGuid = RelatedTable.MainTableIDGuid)
или
UPDATE RelatedTable
SET RelatedTable.MainTableIDInt = MainTable.IDInt
FROM RelatedTable
LEFT OUTER JOIN MainTable ON RelatedTable.MainTableIDGuid = MainTable.IDGuid
«Показать примерный план выполнения» отображается примерно одинаково для обоих этих запросов. План выполнения, который он выкладывает, выполняет следующие действия:
- Кластерный индекс просматривает
MainTable
и RelatedTable
и выполняет слияние с ними [приблизительное число строк = 400 миллионов]
- Сортировка [оценочное количество строк = 400 миллионов]
- Обновление кластеризованного индекса в течение
RelatedTable
[расчетное число строк = 400 миллионов]
Я обеспокоен производительностью этого [сортировка 400 миллионов строк звучит неприятно]. Оправданы ли мои опасения по поводу выполнения этого плана выполнения? Есть ли лучший способ обновить новый идентификатор для моей связанной таблицы, который будет масштабироваться с учетом размера таблиц?