Подтвердить что ты не робот

Накладные расходы по столбцам varchar (max) с небольшими данными

В качестве части массовой загрузки данных из внешнего источника таблица стадий определяется с помощью столбцов varchar (max). Идея состоит в том, что каждый столбец сможет хранить все, что он находит в исходном CSV файле, и что мы будем проверять данные (для типа, размера, персии и т.д.) Позже.

Но я обеспокоен тем, что столбец varchar (max) имеет много накладных расходов для столбцов, которые имеют менее 200 символов. Тот, кто разработал это, уверяет меня, что это лучшая практика для ETL, но я думал, что подтвержу это утверждение с сообществом.

4b9b3361

Ответ 1

Значения столбцов VARCHAR (MAX) будут сохранены в строке таблицы, если это разрешено. Поэтому, если у вас есть одно поле VARCHAR (MAX) и 200, 300 байт, скорее всего, он будет сохранен в очереди с остальными вашими данными. Здесь нет проблем или дополнительных накладных расходов.

Только тогда, когда все данные одной строки не могут быть помещены на одну страницу SQL Server (8K), только тогда SQL Server переместит данные VARCHAR (MAX) в страницы переполнения.

Итак, в целом, я думаю, что вы, возможно, получаете лучшее из обоих миров - встроенное хранилище, при необходимости переполняйте хранилище.

Марк

PS: Как указывает Митч, это поведение по умолчанию может быть отключено - я не вижу никаких веских причин для этого, однако....

Ответ 3

Насколько я знаю, накладные расходы, о которых вы, вероятно, думаете (хранение данных вне строки, так же как значение TEXT или BINARY, хранятся в SQL-сервере) применяются только в том случае, если размер данных превышает 8000 байт, Поэтому не должно быть проблем с этим использованием меньших столбцов для процессов ETL.

Ответ 4

Если вы используете varchar (max) или varbinary (max) в MSSQL2005, SSIS создает временный файл для каждого столбца в вашей записи, это может снизить производительность и стать большой проблемой. MS утверждает, что они решили эту проблему в MSSQL2008.

Ответ 5

Ну, я хочу сказать, что не должно быть таких больших накладных расходов, потому что я не думаю, что sql автоматически назначил выделенное количество данных для nvarchar и вместо этого выделяет только то, что нужно для вставленного, но я не имеют права доказывать или поддерживать эту идею.