segunda-feira, 17 de março de 2014

Índices XML–Sql Server

 

Sabemos que colunas do tipo XML possuem estrutura que podem ser “varrida” pelo SQL Server para localização de dados dentro de um documento XML, mas para melhorar o desempenho da localização de uma dado dentro de uma estrutura XML, podemos criar um índice XML.

Existem 2 tipo de índices XML:

Índice XML Primário:

Colunas XMLs são armazenadas como objetos binários (Blob) no banco de dados, com isso, as buscas em uma coluna desse tipo torna-se muito lenta devido ao grande volume de informação. Para acelerar a busca de informações em uma coluna do tipo XML é recomendado a criação de um índice XML primário.

Na verdade um índice XML primário particiona as informações do XML de forma que fiquem armazenadas divididas com:

  • Nome da Tag do XML
  • caminho raiz do documento
  • valor do nó
  • tipo do nó
  • Chave primária correspondente da tabela

Índice XML Secundário

Após criar um índice primário para uma coluna do tipo XML, podemos criar mais 3 índices secundários para a mesma coluna. Índices secundários ajudam com determinados tipos de consultas XML e só é permitido sua criação após a criação de um índice primário.

Existem 3 tipos de índices secundários:

  • PATH – para consultas que utilizam expressões de caminho XML
  • VALUE – para consultas que buscam valores em qualquer lugar do documento XML
  • PROPERY– para consultas que recuperam particularidades de objetos em qualquer lugar do documento XML junto com colunas adicionais da tabela.

A seguir será demonstrado um script exemplo de criação de índices XML

Criação da tabela:

CREATE TABLE DocumentXML (
   ID int IDENTITY NOT NULL,
   DocumentStore xml NOT NULL,
   CONSTRAINT PK_Document PRIMARY KEY CLUSTERED
   (ID ASC))

Carga da tabela:

INSERT INTO DocumentXML (DocumentStore)
VALUES('<?xml version="1.0" ?>
<Document Name="Poema">
<Author>Fabio</Author>
<Text>Teste 1.</Text>
</Document>')

INSERT INTO DocumentXML (DocumentStore)
VALUES('<?xml version="1.0" ?>
<Document Name="Romance">
<Author>Otavio</Author>
<Text>Teste 2.</Text>
</Document>')

INSERT INTO DocumentXML (DocumentStore)
VALUES('<?xml version="1.0" ?>
<Document Name="Policial">
<Author>Jose</Author>
<Text>Teste 3.</Text>
</Document>')

Consultando resultados inseridos:

SELECT DocumentStore.value('(/Document/@Name)[1]',
                           'varchar(50)' ) as Tipo
FROM DocumentXML

Tipo

Poema
Romance
Policial


SELECT DocumentStore.query('(/Document/Text)') as Texto

Texto

<Text>Teste 1.</Text>
<Text>Teste 2.</Text>
<Text>Teste 3.</Text>


Criando índice primário:

CREATE PRIMARY XML INDEX PkXML_Document
   ON DocumentXML (DocumentStore)

 

Criando índices secundários:

CREATE XML INDEX Ind_Value
ON DocumentXML (DocumentStore)
USING XML index PkXML_Document
FOR VALUE

CREATE XML INDEX Ind_PATH
ON DocumentXML (DocumentStore)
USING XML index PkXML_Document
FOR PATH

CREATE XML INDEX Ind_PROPERTY
ON DocumentXML (DocumentStore)
USING XML index PkXML_Document
FOR PROPERTY

 

Obrigado