Partilhar via


Tipo de dados e colunas xml (SQL Server)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Este artigo discute as vantagens e limitações do tipo de dado xml no SQL Server, ajudando-o a escolher como armazenar dados XML.

Modelo de dados relacional ou XML

Se os seus dados estiverem altamente estruturados com um esquema conhecido, o modelo relacional provavelmente funcionará melhor para armazenamento de dados. O SQL Server fornece a funcionalidade e as ferramentas necessárias que possa precisar. Por outro lado, se a estrutura for semi-estruturada ou não estruturada, ou desconhecida, é necessário considerar a modelação desses dados.

O XML é uma boa escolha se quiser um modelo independente da plataforma para garantir a portabilidade dos dados usando marcação estrutural e semântica. Além disso, é uma opção apropriada se algumas das seguintes propriedades forem satisfeitas:

  • Os seus dados são escassos ou não conhece a estrutura dos dados, ou a estrutura dos seus dados pode mudar significativamente no futuro.

  • Os seus dados representam hierarquia de contenção, em vez de referências entre entidades, e podem ser recursivos.

  • A ordem é inerente aos seus dados.

  • Queres consultar os dados ou atualizar partes deles, com base na sua estrutura.

Se nenhuma destas condições for cumprida, deve usar o modelo de dados relacionais. Por exemplo, se os seus dados estiverem em formato XML mas a sua aplicação usar apenas a base de dados para armazenar e recuperar os dados, uma coluna [n]varchar(max ) é tudo o que precisa. Armazenar os dados numa coluna XML tem benefícios adicionais. Isto inclui que o motor determine se os dados estão bem formados ou são válidos, e também suporte para consultas detalhadas e atualizações nos dados XML.

Razões para armazenar dados XML no SQL Server

Seguem-se algumas das razões para usar funcionalidades XML nativas no SQL Server em vez de gerir os seus dados XML no sistema de ficheiros:

  • Quer partilhar, consultar e modificar os seus dados XML de forma eficiente e transacionada. O acesso detalhado aos dados é importante para a sua aplicação. Por exemplo, pode querer extrair algumas das secções dentro de um documento XML, ou pode querer inserir uma nova secção sem substituir todo o documento.

  • Tens dados relacionais e dados XML e queres interoperabilidade entre dados relacionais e XML dentro da tua aplicação.

  • É necessário suporte de linguagem para consultas e modificação de dados em aplicações multidomínio.

  • Quer que o servidor garanta que os dados estão bem formados e também, opcionalmente, valide os seus dados de acordo com esquemas XML.

  • Queres indexação de dados XML para um processamento eficiente de consultas e boa escalabilidade, e o uso de um otimizador de consultas de primeira qualidade.

  • Queres acesso SOAP, ADO.NET e OLE DB a dados XML.

  • Quer usar a funcionalidade administrativa do servidor de base de dados para gerir os seus dados XML. Por exemplo, isto seria backup, recuperação e replicação.

Se nenhuma destas condições for satisfeita, pode ser melhor armazenar os seus dados como um tipo de objeto grande, não XML, como [n]varchar(max) ou varbinary(max).

Opções de armazenamento XML

As opções de armazenamento para XML no SQL Server incluem as seguintes:

  • Armazenamento nativo como tipo de dados xml

    Os dados são armazenados numa representação interna que preserva o conteúdo XML dos dados. Esta representação interna inclui informações sobre a hierarquia de contenção, a ordem dos documentos e os valores dos elementos e atributos. Especificamente, o conteúdo InfoSet dos dados XML é preservado. Para mais informações sobre a InfoSet, visite http://www.w3.org/TR/xml-infoset. O conteúdo do InfoSet pode não ser uma cópia idêntica do XML de texto, porque a seguinte informação não é mantida: espaços em branco insignificantes, ordem dos atributos, prefixos do espaço de nomes e declaração XML.

    Para o tipo de dado xml tipado, um tipo de dado xml associado a esquemas XML, o InfoSet de validação pós-esquema (PSVI) adiciona informações de tipo ao InfoSet e é codificado na representação interna. Isto melhora significativamente a velocidade de análise. Para mais informações, consulte as especificações do Esquema XML do W3C em http://www.w3.org/TR/xmlschema-1 e http://www.w3.org/TR/xmlschema-2.

  • Mapeamento entre armazenamento XML e relacional

    Ao usar um esquema anotado (AXSD), o XML é decomposto em colunas numa ou mais tabelas. Isto preserva a fidelidade dos dados ao nível relacional. Como resultado, a estrutura hierárquica é preservada, embora a ordem entre os elementos seja ignorada. O esquema não pode ser recursivo.

  • Grande armazenamento de objetos, [n]varchar(max) e varbinary(max)

    Uma cópia idêntica dos dados é armazenada. Isto é útil para aplicações especiais, como documentos legais. A maioria das aplicações não requer uma cópia exata e está satisfeita com o conteúdo XML (fidelidade InfoSet).

Geralmente, pode ter de usar uma combinação destas abordagens. Por exemplo, pode querer armazenar os dados XML numa coluna do tipo de dados xml e promover propriedades a partir dele para colunas relacionais. Ou pode querer usar tecnologia de mapeamento para armazenar partes não recursivas em colunas não XML e apenas as partes recursivas em colunas de tipos de dados xml .

Escolha da tecnologia XML

A escolha da tecnologia XML, XML nativo versus visualização XML, depende geralmente dos seguintes fatores:

  • Opções de armazenamento

    Os seus dados XML podem ser mais adequados para armazenamento de objetos de grande porte (por exemplo, um manual do produto), ou mais adequados para armazenamento em colunas relacionais (por exemplo, um item convertido para XML). Cada opção de armazenamento preserva a fidelidade dos documentos de forma diferente.

  • Capacidades de consulta

    Pode achar uma opção de armazenamento mais adequada do que outra, com base na natureza das suas consultas e na extensão em que consulta os seus dados XML. A consulta detalhada dos seus dados XML, por exemplo, a avaliação de predicados em nós XML, é suportada em graus variados nas duas opções de armazenamento.

  • Indexação de dados XML

    Pode querer indexar os dados XML para acelerar o desempenho das consultas XML. As opções de indexação variam consoante as opções de armazenamento; Tens de fazer a escolha correta para otimizar a tua carga de trabalho.

  • Capacidades de modificação de dados

    Algumas cargas de trabalho envolvem modificações detalhadas de dados XML. Por exemplo, isto pode incluir adicionar uma nova secção dentro de um documento, enquanto outras cargas de trabalho, como conteúdos Web, não o fazem. O suporte à linguagem de modificação de dados pode ser importante para a sua aplicação.

  • Suporte a esquemas

    Os seus dados XML podem ser descritos por um esquema que pode ou não ser um documento de esquema XML. O suporte para XML ligado a esquemas depende da tecnologia XML.

Diferentes escolhas também têm características de desempenho distintas.

Armazenamento XML nativo

Pode armazenar os seus dados XML numa coluna de tipo XML no servidor. Esta é uma escolha adequada se o seguinte se aplicar:

  • Quer uma forma simples de armazenar os seus dados XML no servidor e, ao mesmo tempo, preservar a ordem e a estrutura dos documentos.

  • Pode ou não ter um esquema para os seus dados XML.

  • Quer consultar e modificar os seus dados XML.

  • Queres indexar os dados XML para um processamento de consultas mais rápido.

  • A sua aplicação precisa de visualizações de catálogo do sistema para administrar os seus dados XML e esquemas XML.

O armazenamento XML nativo é útil quando tens documentos XML com uma variedade de estruturas, ou documentos XML que seguem esquemas diferentes ou complexos que são demasiado difíceis de mapear para estruturas relacionais.

Exemplo: Modelar dados XML usando o tipo de dado xml

Considere um manual de produto em formato XML que é composto por um capítulo separado para cada tema e que tem várias secções dentro de cada capítulo. Uma secção pode conter subsecções. Como resultado, <section> é um elemento recursivo. Os manuais de produto contêm uma grande quantidade de conteúdos mistos, diagramas e material técnico; Os dados são semi-estruturados. Os utilizadores podem querer realizar uma pesquisa contextual por tópicos de interesse, como procurar a secção sobre "índice agrupado" dentro do capítulo sobre "indexação", e consultar quantidades técnicas.

Um modelo de armazenamento adequado para os seus documentos XML é uma coluna de tipo de dados xml . Isto preserva o conteúdo InfoSet dos seus dados XML. Indexar a coluna XML beneficia o desempenho da consulta.

Exemplo: Manter cópias exatas de dados XML

Por exemplo, suponha que as regulamentações governamentais exigem que mantenha cópias textuais exatas dos seus documentos XML. Por exemplo, estes podem incluir documentos assinados, documentos legais ou ordens de transação de ações. Pode querer guardar os seus documentos numa coluna [n]varchar(max ).

Para consultas, converte os dados para o tipo de dados xml em tempo de execução e executa o XQuery. A conversão em tempo de execução pode ser dispendiosa, especialmente quando o documento é grande. Se consultares frequentemente, podes armazenar redundantemente os documentos numa coluna de tipo de dados xml e indexá-la enquanto devolves cópias exatas dos documentos da coluna [n]varchar(max ).

A coluna XML pode ser uma coluna computada, baseada na coluna [n]varchar(max ). No entanto, não se pode criar um índice XML numa coluna XML computada, nem um índice XML pode ser construído em colunas [n]varchar(max) ou varbinary(max ).

Tecnologia de visualização XML

Ao definir um mapeamento entre os seus esquemas XML e as tabelas numa base de dados, cria uma vista XML dos seus dados persistentes. A carga em massa XML pode ser usada para preencher as tabelas subjacentes usando a visualização XML. Pode consultar a vista XML usando XPath versão 1.0; a consulta é traduzida para consultas SQL nas tabelas. De forma semelhante, as atualizações também são propagadas para essas tabelas.

Esta tecnologia é útil nas seguintes situações:

  • Queres ter um modelo de programação centrado em XML usando vistas XML sobre os teus dados relacionais existentes.

  • Tem um esquema (XSD, XDR) para os seus dados XML que um parceiro externo pode ter fornecido.

  • A ordem não é importante nos seus dados, ou os dados da tabela de consulta não são recursivos, ou a profundidade máxima de recursão é conhecida de antemão.

  • Quer consultar e modificar os dados através da visualização XML usando o XPath versão 1.0.

  • Quer realizar um carregamento em massa de dados XML e decompô-los nas tabelas subjacentes usando a vista XML.

Exemplos incluem dados relacionais expostos como XML para troca de dados e serviços Web, e dados XML com esquema fixo. Para mais informações.

Exemplo: Dados de modelo usando um esquema XML anotado (AXSD)

Para ilustrar, suponha que tem dados relacionais existentes, como clientes, encomendas e itens de linha, que pretende tratar como XML. Defina uma vista XML usando AXSD sobre os dados relacionais. A visualização XML permite-lhe carregar dados XML em massa nas suas tabelas e consultar e atualizar os dados relacionais usando a visualização XML. Este modelo é útil se tiver de trocar dados que contêm marcação XML com outras aplicações enquanto as suas aplicações SQL funcionam sem interrupções.

Modelo híbrido

Frequentemente, uma combinação de colunas de tipos de dados relacionais e xml é apropriada para modelação de dados. Alguns dos valores dos seus dados XML podem ser armazenados em colunas relacionais, e o restante, ou o valor completo do XML, armazenado numa coluna XML. Isto pode resultar em melhor desempenho, pois tem mais controlo sobre os índices criados nas colunas relacionais e nas características de bloqueio.

Os valores a armazenar em colunas relacionais dependem da sua carga de trabalho. Por exemplo, se recuperar todos os valores XML com base na expressão do caminho, /Customer/@CustId, promover o valor do CustId atributo para uma coluna relacional e indexá-lo pode gerar um desempenho de consulta mais rápido. Por outro lado, se os seus dados XML forem decompostos de forma extensiva e não redundantemente em colunas relacionais, o custo de remontagem pode ser significativo.

Para dados XML altamente estruturados, por exemplo, o conteúdo de uma tabela foi convertido em XML; podes mapear todos os valores para colunas relacionais e, possivelmente, usar tecnologia de visualização XML.

Granularidade dos dados XML

A granularidade dos dados XML armazenados numa coluna XML é importante para bloqueio e, em menor grau, também é importante para atualizações. O SQL Server utiliza o mesmo mecanismo de bloqueio tanto para dados XML como não XML. Portanto, o bloqueio ao nível da linha faz com que todas as instâncias XML na linha fiquem bloqueadas. Quando a granularidade é grande, bloquear grandes instâncias XML para atualizações faz com que a taxa de transferência diminua num cenário multiutilizador. Por outro lado, a decomposição severa perde o encapsulamento do objeto e aumenta o custo de remontagem.

Um equilíbrio entre os requisitos de modelação de dados e as características de bloqueio e atualização é importante para um bom design. No entanto, no SQL Server, o tamanho das instâncias XML armazenadas não é tão crítico.

Por exemplo, as atualizações de uma instância XML são realizadas utilizando o novo suporte para atualizações parciais de objetos binários grandes (BLOB) e de índice parcial, em que a instância XML armazenada existente é comparada com a sua versão atualizada. A atualização de objeto grande binário parcial (BLOB) realiza uma comparação diferencial entre as duas instâncias XML e atualiza apenas as diferenças. As atualizações parciais do índice modificam apenas as linhas que devem ser alteradas no índice XML.

Limitações do tipo de dado xml

Note as seguintes limitações gerais que se aplicam ao tipo de dado xml :

  • A representação armazenada das instâncias de tipo de dados XML não pode exceder 2 GB.

  • Não pode ser usado como subtipo de uma instância sql_variant .

  • Não suporta casting nem conversão para texto ou ntext. Usa varchar (max) ou nvarchar (max) em vez disso.

  • Não pode ser comparado ou resolvido. Isto significa que um tipo de dado xml não pode ser usado numa instrução GROUP BY.

  • Não pode ser usado como parâmetro para quaisquer funções escalares e incorporadas, exceto ISNULL, COALESCE e DATALENGTH.

  • Não pode ser usado como uma coluna chave num índice. No entanto, pode ser incluído como dados num índice agrupado ou explicitamente adicionado a um índice não agrupado usando a palavra-chave INCLUDE quando o índice não agrupado é criado.

  • Os elementos XML podem ser aninhados até 128 níveis.

Consulte também