Pergunta

Estou armazenando dados em uma coluna Varbinária (MAX) e, por razões de desempenho do cliente, Chunkking escreve através da função ".Write ()" usando o SQL Server 2005. Isso funciona muito bem, mas, devido aos efeitos colaterais, quero evitar A coluna varbinária dimensiona dinamicamente durante cada anexo.

O que eu gostaria de fazer é otimizar isso pré-alocando a coluna varbinária para o tamanho que eu quero. Por exemplo, se eu vou soltar 2 MB na coluna, gostaria de 'alocar' a coluna primeiro, depois. Escreva os dados reais usando parâmetros de deslocamento/comprimento.

Existe alguma coisa no SQL que possa me ajudar aqui? Obviamente, não quero enviar uma matriz de bytes nulo para o servidor SQL, pois isso derrotaria parcialmente o objetivo da otimização.

Foi útil?

Solução

Se você estiver usando um tipo de dados (max), qualquer coisa acima do 8K entrará no armazenamento de transbordamento da linha, não no armazenamento na página. Portanto, você só precisa colocar dados suficientes para obtê-los até o 8K para a linha, fazendo com que ocupe a alocação na página para a linha, e o restante entra no armazenamento de fluxo de linha de linha de qualquer maneira. Há mais um pouco aqui.

Se você deseja pré-alocar tudo, incluindo os dados de transbordamento de linha, você pode usar algo semelhante (o exemplo faz 10000 bytes):

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

Outras dicas

Primeiro de tudo, parabéns à resposta fornecida - essa foi uma grande ajuda! No entanto, há uma pequena mudança que você pode considerar. O código acima aloca na verdade o campo varbinário com um caractere zero convertido (código hexadecimal 0x30). Pode não ser o que você realmente deseja, principalmente se deseja executar operações binárias em campo posteriormente. O que eu acho mais útil é alocar o campo com um valor nu (código hexadecimal 0x00) para que todos os bits sejam desligados por padrão. Para fazer isso, basta fazer a seguinte correção:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top