isso pode reduzir o tamanho de tabelas e índices (ênfase adicionada)
Redução no tamanho só é possível se a maioria dos personagens são essencialmente [space]
, 0 - 9
, A - Z
, a - z
, e alguns sinais de pontuação básica. Fora desse conjunto específico de caracteres (em termos de uso prático, valores ASCII padrão 32 - 126), você terá, na melhor das hipóteses , tamanho igual a NVARCHAR
/ UTF-16 ou, em muitos casos, maior.
Estou planejando migrar os dados, pois acredito que a leitura de menos dados levará a um melhor desempenho para o sistema.
Seja cuidadoso. O UTF-8 não é um interruptor mágico "conserte tudo". Todas as outras coisas são iguais, sim, ler menos melhora o desempenho. Mas aqui "todas as outras coisas" não são iguais. Mesmo ao armazenar apenas caracteres ASCII padrão (ou seja: todos os caracteres têm 1 byte, exigindo, portanto, metade do espaço em comparação com a armazenagem NVARCHAR
), há uma pequena penalidade de desempenho ao usar UTF-8. Acredito que o problema se deva ao fato de o UTF-8 ser uma codificação de comprimento variável, o que significa que cada byte deve ser interpretado conforme é lido para saber se é um caractere completo ou se o próximo byte faz parte dele. Isso significa que todas as operações de cadeia precisam começar do início e prosseguir byte a byte. Por outro lado,NVARCHAR
/ UTF-16 é sempre 2 bytes (até caracteres suplementares são compostos por dois pontos de código de 2 bytes), para que tudo possa ser lido em blocos de 2 bytes.
Nos meus testes, mesmo com apenas caracteres ASCII padrão, o armazenamento dos dados como UTF-8 não proporcionou economia de tempo decorrido, mas foi definitivamente pior para o tempo da CPU. E isso sem a compactação de dados, pelo menos havia menos espaço em disco usado. Porém, ao usar a compactação, o espaço necessário para o UTF-8 era apenas 1% - 1,5% menor. Tão eficazmente, sem economia de espaço, quanto maior tempo de CPU para UTF-8.
As coisas ficam mais complicadas ao usar, NVARCHAR(MAX)
pois a compactação Unicode não funciona com esse tipo de dados, mesmo que o valor seja pequeno o suficiente para ser armazenado em linha. Mas, se os dados forem pequenos o suficiente, eles ainda deverão se beneficiar da compactação de linha ou de página (nesse caso, eles realmente se tornam mais rápidos que o UTF-8). No entanto, dados fora da linha não podem usar nenhuma compactação. Ainda assim, tornar a tabela um Índice de armazenamento de colunas em cluster reduz bastante o tamanho de NVARCHAR(MAX)
(mesmo que ainda seja um pouco maior que UTF-8 ao usar o Índice de armazenamento de colunas em cluster).
Alguém pode apontar um cenário e uma razão, para não usar os tipos de dados char com codificação UTF
Definitivamente. Na verdade, não acho realmente um motivo convincente para usá-lo na maioria dos casos. O único cenário que realmente se beneficia do UTF-8 é:
- Os dados são principalmente ASCII padrão (valores 0 - 127)
- Ele precisa ser Unicode, pois pode precisar armazenar um intervalo maior de caracteres do que o disponível em qualquer página de código de 8 bits (por exemplo
VARCHAR
)
- A maioria dos dados é armazenada fora da linha (portanto, a compactação de página nem funciona)
- Você tem dados suficientes para reduzir / reduzir o tamanho por motivos que não envolvem o desempenho da consulta (por exemplo, reduzir o tamanho do backup, reduzir o tempo necessário para fazer backup / restauração, etc.)
- Você não pode usar o Índice de armazenamento de colunas em cluster (talvez o uso da tabela torne o desempenho pior neste caso?)
Meus testes mostram que, em quase todos os casos, o NVARCHAR foi mais rápido, especialmente quando havia mais dados. De fato, 21k linhas com uma média de 5k caracteres por linha exigiam 165 MB para UTF-8 e 236 MB para NVARCHAR
descompactado. E, no entanto, NVARCHAR
foi duas vezes mais rápido no tempo decorrido e pelo menos duas vezes mais rápido (às vezes mais) no tempo da CPU. Ainda assim, foram necessários 71 MB a mais em disco.
Fora isso, eu ainda não recomendaria o uso de UTF-8, pelo menos a partir do CTP 2, devido a uma variedade de erros que encontrei nesse recurso.
Para uma análise detalhada desse novo recurso, incluindo uma explicação das diferenças entre UTF-16 e UTF-8 e uma lista desses erros, consulte o meu post:
Suporte nativo a UTF-8 no SQL Server 2019: Salvador ou Falso Profeta?