накладные расходы на столбцы varchar (max) с небольшими данными - PullRequest
14 голосов
/ 13 мая 2009

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

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

Ответы [ 5 ]

18 голосов
/ 13 мая 2009

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

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

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

Марк

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

6 голосов
/ 13 мая 2009

Для varchar (n) и varchar (max) накладные расходы одинаковы Размер хранилища - это фактическая длина введенных данных + 2 байта

Ссылка MSDN

Проверьте эти похожие вопросы:

https://stackoverflow.com/questions/166371/varcharmax-versus-varcharn-in-ms-sql-server Есть ли недостатки при использовании nvarchar (MAX)?

3 голосов
/ 13 мая 2009

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

0 голосов
/ 29 мая 2009

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

0 голосов
/ 13 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...