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 frequentemente; Vou precisar consultar o XML para encontrar valores de elemento e atributo. Se deixado por conta própria, eu tenderia a usar o tipo de dados xml, embora tenha sido levado a acreditar que isso é causado por problemas. Então isso me leva às minhas perguntas.
Diante desse cenário, o que fatores devo considerar quando se tenta decidir entre o armazenamento de XML em um xml coluna vs. um varchar (MAX) coluna
Se ajudar ... aqui estão alguns detalhes adicionais:
- Nenhuma decisão foi tomada com relação ao uso de esquemas para esses fragmentos ( por exemplo, XSDs )
- Os tamanhos dos fragmentos variam de pequeno a muito grande
- Todo o XML será bem formado
- Ao longo de um dia, haverá até 10.000 fragmentos coletados com o suporte a consultas on-line necessário por aproximadamente 3 meses
- As consultas contra o XML ocorrerão ao longo do dia, mas devem permanecer leves com poucas consultas simultâneas desse tipo
sql-server-2008
database-design
schema
datatypes
xml
JoeGeeky
fonte
fonte
<foo></foo>
se tornarão<foo />
Respostas:
Se as consultas contra o XML ocorrerem pelos recursos xml do servidor sql, use o tipo XML para armazenar um xml para evitar a transmissão
E
lembre-se de que o tipo XML pode ser armazenado um pouco mais devagar devido à validação de xml, mas o tipo subjacente de XML é varbinário comum (máximo)
fonte
VARBINARY(MAX)
. É um formato otimizado, o que significa que, mesmo que você não queira consultá-lo, você ainda deve usar oXML
tipo de dados.Os fatores são:
XML
tipo é consultável / analisável através de expressões XQuery, incluindo a possibilidade de usar a instrução e a iteração FLWORXML
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)
, considerando queNCHAR
/NVARCHAR
também é UTF-16 LE.XML
os dados podem ser validados com relação a um XSD /XML SCHEMA COLLECTION
. Nenhuma validação (fora de garantir a boa formação) é feita se nenhuma XML Schema Collection for especificada, mas essa opção não estará disponível ao usarNVARCHAR(MAX)
.Um grande benefício do tipo XML é que ele é armazenado em um formato altamente otimizado (não
VARBINARY(MAX)
como indicado na resposta de @ Oleg) que não armazena a representação exata da string que você vê, mas possui um dicionário de nomes de elemento e atributo e se refere para eles por sua identificação. Ele também remove os espaços em branco. Tente o seguinte:Devoluções:
Como você pode ver no exemplo de saída acima, adicionar quatro elementos (nº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 é menor do que a adicionadaVARCHAR
(apenas no caso de alguém argumentar a favor doVARCHAR
excesso,XML
porqueXML
é o UTF-16, que é [principalmente] de byte duplo). Essa otimização pode economizar muito espaço e é motivo suficiente para usar oXML
tipo de dados.fonte