Índices XML–Sql Server
Autor: Fabio Martinez | Publicado: 2014-03-17T19:20:00-07:00

&nbsp; 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 (&nbsp;&nbsp; ID int IDENTITY NOT NULL,&nbsp;&nbsp; DocumentStore xml NOT NULL,&nbsp;&nbsp; CONSTRAINT PK_Document PRIMARY KEY CLUSTERED&nbsp;&nbsp; (ID ASC)) Carga da tabela:  INSERT INTO DocumentXML (DocumentStore)VALUES('&lt;?xml version="1.0" ?&gt;&lt;Document Name="Poema"&gt;&lt;Author&gt;Fabio&lt;/Author&gt;&lt;Text&gt;Teste 1.&lt;/Text&gt;&lt;/Document&gt;') INSERT INTO DocumentXML (DocumentStore)VALUES('&lt;?xml version="1.0" ?&gt;&lt;Document Name="Romance"&gt;&lt;Author&gt;Otavio&lt;/Author&gt;&lt;Text&gt;Teste 2.&lt;/Text&gt;&lt;/Document&gt;') INSERT INTO DocumentXML (DocumentStore)VALUES('&lt;?xml version="1.0" ?&gt;&lt;Document Name="Policial"&gt;&lt;Author&gt;Jose&lt;/Author&gt;&lt;Text&gt;Teste 3.&lt;/Text&gt;&lt;/Document&gt;') Consultando resultados inseridos:  SELECT DocumentStore.value('(/Document/@Name)[1]',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'varchar(50)' ) as TipoFROM DocumentXML     Tipo  Poema  Romance  Policial  SELECT DocumentStore.query('(/Document/Text)') as Texto     Texto  &lt;Text&gt;Teste 1.&lt;/Text&gt;  &lt;Text&gt;Teste 2.&lt;/Text&gt;  &lt;Text&gt;Teste 3.&lt;/Text&gt; Criando índice primário:  CREATE PRIMARY XML INDEX PkXML_Document&nbsp;&nbsp; ON DocumentXML (DocumentStore) &nbsp; Criando índices secundários:  CREATE XML INDEX Ind_ValueON DocumentXML (DocumentStore)USING XML index PkXML_DocumentFOR VALUE CREATE XML INDEX Ind_PATHON DocumentXML (DocumentStore)USING XML index PkXML_DocumentFOR PATH CREATE XML INDEX Ind_PROPERTYON DocumentXML (DocumentStore)USING XML index PkXML_DocumentFOR PROPERTY &nbsp; Obrigado