Estou definindo um esquema para um novo conjunto de recursos usando o SQL Server 2008... Nesse caso, cada registro ( por exemplo, linha ) precisará armazenar fragmentos XML. De tempos em tempos; embora não com frequência; Vou precisar consultar o XML para encontrar valores de elementos e atributos. Se deixado por conta própria, eu tenderia a usar o tipo de dados XML , embora tenha sido levado a acreditar que isso é forjado com problemas. Então isso me leva às minhas perguntas.
Diante desse cenário, quais fatores devo considerar ao tentar decidir entre armazenar XML em uma coluna XML ou uma coluna varchar(MAX)
Se ajudar... aqui estão alguns detalhes adicionais:
- Nenhuma decisão foi tomada em relação ao uso de esquemas para esses fragmentos ( por exemplo, XSD's )
- Os tamanhos dos fragmentos variam de pequenos a muito grandes
- Todo o XML será bem formado
- Ao longo de um dia, haverá até ~ 10.000 fragmentos coletados com suporte de consulta on-line necessário por ~ 3 meses
- As consultas ao XML acontecerão ao longo do dia, mas devem permanecer leves com poucas consultas simultâneas desse tipo
Os fatores são:
O
XML
tipo pode ser consultado/analisado por meio de expressões XQuery, inclusive podendo usar instrução FLWOR e iteraçãoOs dados em
XML
variáveis e colunas podem ser modificados em linha usando expressões XQuery via XML DML .XML
os dados são armazenados como UTF-16 LE (Little Endian), portanto,VARCHAR(MAX)
seria uma má escolha, pois poderia resultar em perda de dados. Portanto, a verdadeira decisão deve estar entreXML
eNVARCHAR(MAX)
, dado queNCHAR
/NVARCHAR
também é UTF-16 LE.XML
os dados podem ser validados em um arquivo XSD /XML SCHEMA COLLECTION
. Nenhuma validação (além de garantir a boa formação) é feita se nenhuma Coleção de Esquema XML for especificada, mas esta opção não está disponível ao usarNVARCHAR(MAX)
.Um grande benefício do tipo XML é que ele é armazenado em um formato altamente otimizado (não
VARBINARY(MAX)
conforme declarado na resposta de @Oleg ) que não armazena a representação de string exata que você vê, mas em vez disso possui um dicionário de nomes de elementos e atributos e refere-se a eles por seu ID. Também remove espaços em branco. Tente o seguinte:Retorna:
Como você pode ver no exemplo de saída acima, adicionar quatro elementos (#s 3, 4, 5 e 6) adicionou 80 caracteres (portanto, 80 bytes se estiver usando
VARCHAR
) e 160 bytes àNVARCHAR
variável. No entanto, ele adicionou apenas 28 bytes à variável XML, que é menos do que foi adicionadoVARCHAR
(apenas no caso de alguém argumentar a favor deVARCHAR
maisXML
porqueXML
é UTF-16, que é [principalmente] byte duplo). Essa otimização pode economizar muito espaço e é motivo suficiente por si só para usar o tipo deXML
dados.Os dados XML podem ser indexados por meio de índices XML especializados
Se as consultas no XML ocorrerem pelos recursos xml do servidor SQL, use o tipo XML para armazenar um xml para evitar a conversão
E
tenha em mente que o tipo XML pode ser armazenado um pouco mais devagar devido à validação xml, mas o tipo subjacente de XML é varbinary(max) comum
Um dos principais contribuintes para a diferença de armazenamento entre NVARCHAR(MAX) não discutido na resposta original é que NVARCHAR(MAX) não usa SCSU; usar pares de colunas NVARCHAR(N) + NVARCHAR(MAX) pode reduzir significativamente os requisitos de armazenamento, além da compactação de página mencionada abaixo. Consulte 'compressão' SCSU manual no SQL Server 2017 para NVARCHAR(MAX)
—
Uma consideração que não está presente nas outras respostas está relacionada à compactação de página. Com a compactação de página, existem alguns casos de uso muito específicos , nos quais o armazenamento de XML como NVARCHAR(MAX) pode ser benéfico, dependendo de alguns fatores específicos.
Este é um cenário especial e só deve ser considerado após análise de dados e uso. No cenário apresentado, isso parece improvável.
Considerações de quando alguém pode considerar NVARCHAR(MAX) sobre XML:
Algumas desvantagens e contra-argumentos:
Em um cenário muito específico em que tenho trabalhado, o uso de NVARCHAR(MAX) resulta em mais de 20% de redução no uso de disco quando aplicado a muitos fragmentos pequenos com alta duplicação. YMMV. Teste com dados e usos reais.