Tipo de dados xml e colunas (SQL Server)

Aplica-se a: SQL Server (todas as versões com suporte) SQL do Azure Banco de Dados

Este artigo discute as vantagens e as limitações do tipo de dados xml em SQL Server e ajuda você a escolher como armazenar dados XML.

Modelo de dados relacional ou XML

Se seus dados forem altamente estruturados com um esquema conhecido, o modelo relacional provavelmente funcionará melhor para o armazenamento de dados. SQL Server fornece a funcionalidade exigida e ferramentas que podem ser necessárias. Por outro lado, se a estrutura estiver semiestruturada, desestruturada ou desconhecida, será necessário considerar a modelagem desses dados.

O XML é uma boa opção se você desejar um modelo independente de plataforma para garantir a portabilidade dos dados usando marcação estrutural e semântica. Além disso, ele será uma opção apropriada se algumas das seguintes propriedades forem atendidas:

  • Seus dados são esparsos ou você não conhece a estrutura dos dados ou a estrutura dos dados pode mudar significativamente no futuro.

  • Seus dados representam hierarquia de confinamento, em vez de referências entre entidades, e podem ser recursivos.

  • A ordem é inerente em seus dados.

  • Você deseja consultar os dados ou atualizar partes dos dados com base em sua estrutura.

Se nenhuma dessas condições for atendida, você deverá usar o modelo de dados relacional. Por exemplo, se os dados estiverem em formato XML, mas seu aplicativo usar o banco de dados apenas para armazenar e recuperar dados, uma coluna [n]varchar(max) é tudo o que você precisa. O armazenamento de dados em uma coluna XML traz benefícios adicionais. Isso inclui fazer com que o mecanismo determine se os dados estão bem formados ou válidos e, também, inclui suporte para atualizações e consultas refinadas nos dados XML.

Motivos para armazenar dados XML no SQL Server

A seguir estão algumas das razões para usar recursos do XML nativo no SQL Server em vez do gerenciamento de dados XML no sistema de arquivos:

  • Você deseja compartilhar, consultar e modificar dados XML de uma maneira eficiente e transacionada. O acesso a dados refinados é importante para seu aplicativo. Por exemplo, você pode desejar extrair algumas das seções dentro de um documento XML ou inserir uma nova seção sem substituir todo o documento.

  • Você tem dados relacionais e dados XML e deseja ter interoperabilidade entre os dados relacionais e XML dentro de seu aplicativo.

  • Você precisa de suporte a idioma para consulta e modificação de dados para aplicativos entre domínios.

  • Você deseja que o servidor garanta que os dados estejam bem formados além de, opcionalmente, validar os dados de acordo com esquemas XML.

  • Você deseja indexação de dados XML para processamento eficiente de consultas e boa escalabilidade e o uso de um otimizador de consulta de primeira classe.

  • Você deseja acesso de OLE DB, SOAP e ADO.NET a dados XML.

  • Você deseja usar a funcionalidade administrativa do servidor de banco de dados para gerenciar dados XML. Por exemplo, backup, recuperação e replicação.

Se nenhuma dessas condições for atendida, talvez seja melhor armazenar os 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 de XML no SQL Server incluem o seguinte:

  • Armazenamento nativo como tipo de dados xml

    Os dados são armazenados em uma representação interna que preserva o conteúdo XML dos dados. Essa representação interna inclui informações sobre a hierarquia de confinamento, a ordem dos documentos e os valores do elemento e do atributo. Especificamente, o conteúdo de InfoSet dos dados XML é preservado. Para obter mais informações sobre 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, pois as seguintes informações não são retidas: espaços em branco insignificantes, ordem de atributos, prefixos de namespace e declaração XML.

    Para o tipo de dados xml com tipo, um tipo de dados xml associado a esquemas XML, a PSVI (post-schema validation InfoSet) adiciona informações de tipo ao InfoSet e é codificada na representação interna. Isto melhora a velocidade da análise significativamente. Para obter mais informações, consulte as especificações de Esquema XML do W3C em http://www.w3.org/TR/xmlschema-1 e http://www.w3.org/TR/xmlschema-2.

  • Mapeando entre XML e armazenamento relacional

    Usando um AXSD (annotated schema), o XML é decomposto em colunas em uma ou mais tabelas. Isso preserva a fidelidade dos dados no 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.

  • Armazenamento de objeto grande, [n]varchar(max) e varbinary(max)

    Uma cópia idêntica dos dados é armazenada. Isso é útil para aplicativos com finalidades especiais, como documentos legais. A maioria dos aplicativos não exige uma cópia exata e está satisfeita com o conteúdo XML (fidelidade do InfoSet).

Geralmente, você pode precisar usar uma combinação dessas abordagens. Por exemplo, você pode desejar armazenar dados XML em uma coluna de tipo de dados xml e promover propriedades dela em colunas relacionais. Ou então, você 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 tipo de dados xml .

Escolha da tecnologia XML

A opção de tecnologia XML, XML nativo versus exibição de XML, geralmente depende dos seguintes fatores:

  • Opções de armazenamento

    Os dados XML podem ser mais apropriados para armazenamento de objetos grandes (por exemplo, um manual do produto) ou mais compatível para armazenamento em colunas relacionais (por exemplo, um item de linha convertido em XML). Cada opção de armazenamento preserva a fidelidade do documento a uma extensão diferente.

  • Capacidades de consulta

    Uma opção de armazenamento pode ser mais apropriada do que outra com base na natureza de suas consultas e na extensão na qual os dados XML são consultados. Nas duas opções de armazenamento, há suporte em vários níveis para consulta refinada de seus dados XML, por exemplo, para avaliação de predicado em nós XML.

  • Indexando dados XML

    Talvez você deseje indexar os dados XML para acelerar o desempenho de consultas XML. As opções de indexação variam de acordo com as opções de armazenamento. É necessário fazer a escolha apropriada para otimizar sua carga de trabalho.

  • Capacidades de modificação de dados

    Algumas cargas de trabalho envolvem modificação refinada de dados XML. Por exemplo, isso pode incluir a adição de uma nova seção em um documento, enquanto outras cargas de trabalho, como conteúdo da Web, não. O suporte à linguagem de modificação de dados pode ser importante para seu aplicativo.

  • Suporte de esquema

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

Opções diferentes também têm características diferentes de desempenho.

Armazenamento XML nativo

É possível armazenar dados XML em uma coluna de tipo de dados xml no servidor. Essa escolha será apropriada se as seguintes condições forem aplicadas:

  • Você deseja uma maneira direta de armazenar dados XML no servidor e, ao mesmo tempo, preservar a ordem e a estrutura do documento.

  • Você pode ou não ter um esquema para seus dados XML.

  • Você deseja consultar e modificar os dados XML.

  • Você deseja indexar os dados XML para acelerar o processamento de consultas.

  • Seu aplicativo precisa de exibições do catálogo do sistema para administrar seus dados e esquemas XML.

O armazenamento XML nativo é útil quando você tem documentos XML que têm um intervalo de estruturas ou documentos XML que estão de acordo com esquemas diferentes ou complexos muito difíceis de mapear para estruturas relacionais.

Exemplo: modelar dados XML usando o tipo de dados xml

Considere o manual de um produto em formato XML composto por um capítulo separado para cada tópico e com várias seções dentro de cada capítulo. Uma seção pode conter subseções. Como resultado, <section> é um elemento recursivo. Os manuais de produtos contêm uma grande quantidade de conteúdo misto, diagramas e material técnico. Os dados são semiestruturados. Os usuários podem desejar executar uma pesquisa contextual para obter tópicos de interesse, como pesquisar a seção sobre "índice clusterizado" dentro do capítulo sobre "indexação" e consultar as quantidades técnicas.

Um modelo de armazenamento apropriado para seus documentos XML é uma coluna de tipo de dados xml . Isso preserva o conteúdo de InfoSet de seus dados XML. A indexação de colunas XML beneficia o desempenho de consultas.

Exemplo: reter cópias exatas de dados XML

Para ilustrar, assuma que os regulamentos governamentais exigem que você mantenha cópias textuais exatas de seus documentos XML. Por exemplo, isso pode incluir documentos assinados, documentos legais ou pedidos de transação de estoque. Você pode desejar armazenar seus documentos em uma coluna [n]varchar(max) .

Para consultar, converta os dados em tipo de dados xml em tempo de execução e execute XQuery nele. A conversão em tempo de execução pode ser dispendiosa, principalmente quando o documento é grande. Se a consulta for feita com frequência, você poderá armazenar os documentos de maneira redundante em uma coluna de tipo de dados xml e indexá-los enquanto retorna 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, você não pode criar um índice XML em uma coluna XML computada nem um índice XML pode ser criado em colunas [n]varchar(max) ou varbinary(max ).

Tecnologia de exibição XML

Ao definir um mapeamento entre os esquemas XML e as tabelas em um banco de dados, você cria uma exibição XML dos dados persistentes. O carregamento de XML em massa pode ser usado para popular as tabelas subjacentes usando a exibição XML. É possível consultar a exibição XML usando XPath versão 1.0. A consulta é convertida em consultas SQL nas tabelas. De maneira semelhante, as atualizações também são propagadas para essas tabelas.

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

  • Você deseja ter um modelo de programação centrado em XML usando exibições XML sobre seus dados relacionais existentes.

  • Você tem um esquema (XSD, XDR) para seus dados XML que um parceiro externo pode ter fornecido.

  • A ordem não é importante em seus dados ou os dados da tabela de consulta não são recursivos ou a profundidade máxima de recursão é conhecida com antecedência.

  • Você deseja consultar e modificar os dados pela exibição XML usando XPath versão 1.0.

  • Você deseja carregar dados XML em massa e decompô-los nas tabelas subjacentes usando a exibição XML.

Os exemplos incluem dados relacionais expostos como XML para troca de dados e serviços da Web e dados XML com esquema fixo. Para obter mais informações.

Exemplo: modelar dados usando um esquema XML anotado (AXSD)

Para ilustrar, assuma que você tem dados relacionais existentes, como clientes, pedidos e itens de linha que deseja tratar como XML. Defina uma exibição XML usando AXSD sobre dados relacionais. A exibição XML permite carregar dados XML em massa em suas tabelas e consultar e atualizar os dados relacionais usando a exibição XML. Esse modelo é útil se você precisar trocar dados que contêm marcação XML com outros aplicativos enquanto seus aplicativos SQL funcionam sem interrupção.

Modelo híbrido

Frequentemente, uma combinação de colunas de tipos de dados relacionais e xml é apropriada para modelagem de dados. Alguns dos valores de seus dados XML podem ser armazenados em colunas relacionais e o restante, ou todo o valor XML, armazenado em uma coluna XML. Isso pode resultar em um melhor desempenho no qual você terá mais controle sobre os índices criados nas colunas relacionais e características de bloqueio.

Os valores a serem armazenados em colunas relacionais dependem de sua carga de trabalho. Por exemplo, se você recuperar todos os valores XML com base na expressão de caminho, /Customer/@CustIdpromover o valor do CustId atributo em uma coluna relacional e indexá-lo poderá gerar um desempenho de consulta mais rápido. Por outro lado, se os dados XML forem amplamente e não decompostos em colunas relacionais, o custo de remontagem poderá ser significativo.

Para dados XML altamente estruturados, por exemplo, o conteúdo de uma tabela foi convertido em XML, você pode mapear todos os valores para colunas relacionais e provavelmente usar tecnologia de exibição XML.

Granularidade de dados XML

A granularidade dos dados XML armazenados em uma coluna XML é importante para o bloqueio e, em menor grau, também é importante para atualizações. SQL Server usa o mesmo mecanismo de bloqueio para dados XML e não XML. Portanto, o bloqueio em nível de linha faz com que todas as instâncias XML na linha sejam bloqueadas. Quando a granularidade é grande, o bloqueio de grandes instâncias XML para atualizações faz com que a taxa de transferência decline em um cenário multiusuário. Por outro lado, a decomposição grave perde o encapsulamento de objetos e aumenta o custo de reassembly.

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

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

Limitações do tipo de dados xml

Observe as seguintes limitações gerais que se aplicam ao tipo de dados xml :

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

  • Ele não pode ser usado como um subtipo de uma instância de sql_variant .

  • Ele não dá suporte à conversão ou conversão em texto ou ntext. Em vez disso, use varchar(max) ou nvarchar(max) .

  • Não pode ser comparado ou classificado. Isso significa que um tipo de dados xml não pode ser usado em uma instrução GROUP BY.

  • Ele não pode ser usado como um parâmetro para funções escalares e internas que não sejam ISNULL, COALESCE e DATALENGTH.

  • Ele não pode ser usado como uma coluna de chave em um índice. No entanto ele pode ser incluído como dados em um índice clusterizado ou adicionado explicitamente em um índice não clusterizado usando a palavra-chave INCLUDE quando o índice não clusterizado é criado.

  • Elementos XML podem ser aninhados em até 128 níveis.

Confira também