Предварительно выделить varbinary (max) без фактической отправки пустых данных на SQL Server? - PullRequest
1 голос
/ 02 февраля 2010

Я храню данные в столбце varbinary (max) и, по соображениям производительности клиента, чанки записывает через функцию ".WRITE ()" с использованием SQL Server 2005. Это прекрасно работает, но из-за побочных эффектов хотите избежать динамического изменения размера столбца varbinary при каждом добавлении.

Что я хотел бы сделать, это оптимизировать это, предварительно выделив столбец varbinary под нужный мне размер. Например, если я собираюсь поместить 2 МБ в столбец, я хотел бы сначала «выделить» столбец, а затем. ЗАПИСАТЬ реальные данные, используя параметры смещения / длины.

Есть ли что-нибудь в SQL, что может помочь мне здесь? Очевидно, что я не хочу отправлять нулевой байтовый массив на сервер SQL, так как это частично нарушит цель оптимизации .WRITE.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Если вы используете тип данных (MAX), то все, что выше 8K, попадает в хранилище с переполнением строк, а не в хранилище на странице. Таким образом, вам просто нужно ввести достаточно данных, чтобы получить до 8 КБ для строки, чтобы они занимали распределение на странице для строки, а остальное все равно помещается в хранилище с переполнением строки. Здесь есть еще .

Если вы хотите предварительно выделить все, включая данные о переполнении строк, вы можете использовать что-то похожее (например, 10000 байт):

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), '0'), 10000))
1 голос
/ 17 июня 2014

Прежде всего, спасибо за предоставленный ответ - это была отличная помощь! Однако есть одно небольшое изменение, которое вы можете рассмотреть. Приведенный выше код фактически выделяет поле varbinary с преобразованным нулевым символом (шестнадцатеричный код 0x30). Это может быть не совсем то, что вам нужно, особенно если вы хотите выполнить двоичные операции над полем позже. То, что я считаю более полезным, - это присвоить полю значение NUL (шестнадцатеричный код 0x00), чтобы все биты были отключены по умолчанию. Для этого просто сделайте следующее исправление:

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), CHAR(0)), 10000))

...