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 VALUECREATE XML INDEX Ind_PATH
ON DocumentXML (DocumentStore)
USING XML index PkXML_Document
FOR PATHCREATE XML INDEX Ind_PROPERTY
ON DocumentXML (DocumentStore)
USING XML index PkXML_Document
FOR PROPERTY
Obrigado