Предварительно выделить varbinary(max) без фактической отправки пустых данных на SQL Server?
Я храню данные в столбце varbinary(max) и, по соображениям производительности клиента, чанки записывает через функцию ".WRITE()" с использованием SQL Server 2005. Это прекрасно работает, но из-за побочных эффектов я хочу избежать столбец varbinary динамически изменяет размер в течение каждого добавления.
То, что я хотел бы сделать, это оптимизировать это, предварительно выделив столбец varbinary под нужный мне размер. Например, если я собираюсь поместить 2 МБ в столбец, я бы сначала хотел "выделить" столбец, а затем. ЗАПИСАТЬ реальные данные, используя параметры смещения / длины.
Есть ли что-то в SQL, что может помочь мне здесь? Очевидно, что я не хочу отправлять нулевой байтовый массив на сервер SQL, так как это частично отразило бы цель оптимизации.WRITE.
2 ответа
Если вы используете тип данных (MAX), то все, что выше 8K, попадает в хранилище с переполнением строк, а не в хранилище на странице. Таким образом, вам просто нужно ввести достаточно данных, чтобы получить до 8 КБ для строки, что потребует выделения на странице для строки, а остальное все равно попадет в хранилище с переполнением строки. Здесь есть еще немного.
Если вы хотите предварительно выделить все, включая данные о переполнении строк, вы можете использовать что-то похожее (например, 10000 байт):
SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), '0'), 10000))
Прежде всего, спасибо за предоставленный ответ - это была отличная помощь! Однако есть одно небольшое изменение, которое вы можете рассмотреть. Приведенный выше код фактически выделяет поле varbinary с преобразованным нулевым символом (шестнадцатеричный код 0x30). Это может быть не совсем то, что вы на самом деле хотите, особенно если вы хотите выполнить двоичные операции над полем позже. То, что я считаю более полезным, - это присвоить полю значение NUL (шестнадцатеричный код 0x00), чтобы все биты были отключены по умолчанию. Для этого просто сделайте следующее исправление:
SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), CHAR(0)), 10000))