#sql-server
#sql-server
Вопрос:
У меня есть таблица с именем Range
, которая содержит столбец min_value
с типом данных int
. Мне нужно сохранить длинное значение для этого столбца. ALTER TABLE
выделяет больше места для существующих данных. Это неэффективно. По сути, мне нужно больше места для записей, которые будут добавлены в будущем. Не для существующих.
Комментарии:
1. У вас не может быть одного типа данных для существующих данных и другого, большего размера для будущих данных. Если
int
он уже недостаточно велик, вам нужно использоватьALTER TABLE
для изменения типа данных этого столбца наBIGINT
— и это относится ко всем строкам — существующим и будущим. Обойти это невозможно.
Ответ №1:
Вероятно, вам лучше всего просто использовать ALTER TABLE
и изменять тип данных столбца на BIGINT
.
Если вы беспокоитесь о значениях, занимающих 8 байт, которые могут занимать намного меньше, вы можете включить сжатие строк, если в Enterprise Edition это одна из проблем, которую это решает.
Альтернативой может быть добавление нового столбца BIGINT min_value2
с нулевым значением . У вас может быть ограничение проверки, которое гарантирует, что только один столбец имеет значение и не сохраняется вычисляемый столбец с использованием ISNULL(min_value2,min_value) . Первоначально это было бы довольно дешево, поскольку это только метаданные, но со временем это будет дороже, поскольку новые строки и обновленные строки в конечном итоге займут место для обоих столбцов.
Другой альтернативой было бы создать новую таблицу с помощью BIGINT и просто перейти к использованию ее для строк, которые в ней нуждаются. У вас могло бы сложиться мнение, что объединение объединяет их все вместе. Но это добавило бы сложности и, вероятно, снизило бы эффективность плана выполнения запросов.