Partilhar via


Índices XML secundários

Para melhorar o desempenho da pesquisa, você pode criar índices XML secundários. Um índice XML primário deve existir para que seja possível criar índices secundários. Estes são os tipos:

  • Índice XML secundário PATH

  • Índice XML secundário VALUE

  • Índice XML secundário PROPERTY

A seguir estão algumas diretrizes para criação de um ou mais índices secundários:

  • Se sua carga de trabalho usar expressões de caminho significativamente em colunas XML, o índice XML secundário PATH provavelmente acelerará sua carga de trabalho. O caso mais comum é o uso do método exist() em colunas XML na cláusula WHERE do Transact-SQL.

  • Se sua carga de trabalho recuperar vários valores de instâncias XML individuais usando expressões de caminho, caminhos de clustering dentro de cada instância XML no índice PROPERTY poderão ser úteis. Isso normalmente ocorre em um cenário de recipiente de propriedades quando as propriedades de um objeto são buscadas e seu valor de chave primária é conhecido.

  • Se sua carga de trabalho envolver consulta de valores dentro de instâncias XML sem conhecer os nomes de elementos ou de atributos que contêm esses valores, você poderá desejar criar o índice VALUE. Normalmente isso ocorre com pesquisas de eixos descendentes, como //author[last-name="Howard"], em que elementos <author> podem ocorrer em qualquer nível da hierarquia. Isso também ocorre em consultas com caractere curinga, como /book [@* = "novel"], em que a consulta procura por elementos <book> que têm algum atributo com o valor "novel".

Índice XML secundário PATH

Se suas consultas normalmente especificarem expressões de caminho em colunas de tipo xml, um índice secundário PATH poderá acelerar a pesquisa. Conforme descrito anteriormente neste tópico, o índice primário é útil quando você tem consultas que especificam o método exist() na cláusula WHERE. Se você adicionar um índice secundário PATH, poderá também melhorar o desempenho da pesquisa nessas consultas.

Embora um índice XML primário evite precisar fragmentar objetos binários grandes XML em tempo de execução, ele pode fornecer o melhor desempenho para consultas baseadas em expressões de caminho. Como todas as linhas no índice XML primário correspondentes a um objeto binário grande são pesquisadas seqüencialmente para grandes instâncias XML, a pesquisa seqüencial pode ser lenta. Nesse caso, ter um índice secundário construído nos valores de caminho e valores de nós no índice primário pode acelerar significativamente a pesquisa do índice. No índice secundário PATH, o valores de caminhos e de nós são colunas chave que permitem buscas mais eficientes ao pesquisar caminhos. O otimizador de consulta pode usar o índice PATH para expressões como as mostradas no seguinte:

  • /root/Location que especifica apenas um caminho

OU

  • /root/Location/@LocationID[.="10"] onde o caminho e o valor do nó são especificados.

A consulta seguinte mostra onde o índice PATH é útil:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1

Na consulta, a expressão de caminho /PD:ProductDescription/@ProductModelID e o valor "19" no método exist() correspondem aos campos de chave do índice PATH. Isso permite busca direta no índice PATH e fornece desempenho melhor de pesquisa do que a pesquisa seqüencial de valores de caminho no índice primário.

Índice XML secundário VALUE

Se as consultas forem baseadas em valor, por exemplo, /Root/ProductDescription/@*[. = "Mountain Bike"] ou //ProductDescription[@Name = "Mountain Bike"] e o caminho não for especificado completamente ou se incluir um caractere curinga, você poderá obter resultados mais rápidos construindo um índice XML secundário construído sobre valores de nós no índice XML primário.

As colunas de chave do índice VALUE são (valor de nó e caminho) do índice XML primário. Se sua carga de trabalho envolver consulta de valores de instâncias XML sem conhecer os nomes de elementos ou de atributos que contêm os valores, um índice VALUE poderá ser útil. Por exemplo, a expressão a seguir se beneficiará da existência de um índice VALUE:

  • //author[LastName="someName"] onde você sabe o valor do elemento <LastName>, mas o pai de <author> pode ocorrer em qualquer lugar.

  • /book[@* = "someValue"] onde a consulta procura o elemento <book> que tem algum atributo contendo o valor "someValue".

A consulta a seguir retorna ContactID da tabela Contact. A cláusula WHERE especifica um filtro que procura valores no tipo de coluna AdditionalContactInfoxml. As IDs de contato serão retornadas apenas se o objeto binário grande XML das informações de contato adicionais correspondentes incluírem um número de telefone específico. Como o elemento <telephoneNumber> pode aparecer em qualquer lugar no XML, a expressão de caminho especifica o eixo descendente ou independente.

WITH XMLNAMESPACES (
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)

SELECT ContactID 
FROM   Person.Contact
WHERE  AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1

Nessa situação, o valor da pesquisa de <number> é conhecido, mas ele pode aparecer em qualquer lugar na instância XML como um filho do elemento <telephoneNumber>. Esse tipo de consulta pode se beneficiar de um índice de pesquisa baseado em um valor específico.

Índice XML secundário PROPERTY

Consultas que recuperam um ou mais valores de instâncias XML individuais podem se beneficiar de um índice PROPERTY. Esse cenário ocorre ao recuperar propriedades de objetos usando o método value() do tipo xml e quando o valor da chave primária do objeto é conhecido.

O índice PROPERTY é construído nas colunas (PK, Caminho e valor do nó) do índice XML primário, em que PK é a chave primária da tabela base.

Por exemplo, para obter o modelo do produto 19, a consulta a seguir recupera o ProductModelID e os valores do atributo ProductModelName usando o método value(). Em vez de usar o índice XML primário ou os outros índices XML secundários, o índice PROPERTY pode fornecer execução mais rápida.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') as ModelID,
       CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') as ModelName        
FROM Production.ProductModel   
WHERE ProductModelID = 19

Exceto pelas diferenças descritas posteriormente neste tópico, a criação de um índice XML em uma coluna de tipo xml é semelhante à criação de um índice em uma coluna de tipo não-xml. As instruções DDL do Transact-SQL a seguir podem ser usadas para criar e gerenciar índices XML:

Consulte também

Conceitos