Partilhar via


Especificar caminhos e dicas de otimização para índices XML seletivos

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Este artigo descreve como especificar caminhos de nó para sugestões de indexação e otimização ao criar ou modificar índices XML seletivos.

Você especifica caminhos de nó e dicas de otimização simultaneamente numa das seguintes declarações:

Para obter mais informações sobre índices XML seletivos, consulte Selective XML Indexes (SXI).

Compreender os tipos XQuery e SQL Server em XML não tipado

Os índices XML seletivos oferecem suporte a dois tipos de sistemas: tipos XQuery e tipos SQL Server. O caminho indexado pode ser usado para corresponder a uma expressão XQuery ou para corresponder ao tipo de retorno do método value() do xml tipo de dados.

  • Quando um caminho para o índice não é anotado ou é anotado com a palavra-chave XQUERY, o caminho corresponde a uma expressão XQuery. Há duas variações de caminhos de nó anotados com XQUERY:

    • Se você não especificar a palavra-chave XQUERY e o tipo de dados XQuery, os mapeamentos padrão serão usados. Normalmente, o desempenho e o armazenamento não são ideais.

    • Se você especificar a palavra-chave XQUERY e o tipo de dados XQuery e, opcionalmente, outras dicas de otimização, poderá obter o melhor desempenho possível e o armazenamento mais eficiente possível. No entanto, um elenco pode falhar.

  • Quando um caminho para o índice é anotado com a palavra-chave SQL, o caminho corresponde ao tipo de retorno do método value() do tipo de dados xml. Especifique o tipo de dados SQL Server apropriado, que é o tipo de retorno que você espera do método value().

Há diferenças sutis entre o sistema de tipo XML de expressões XQuery e o sistema de tipo do SQL Server aplicado ao método value() do tipo de dados xml. Essas diferenças incluem o seguinte:

  • O sistema do tipo XQuery está ciente dos espaços à direita. Por exemplo, de acordo com a semântica do tipo XQuery, as cadeias de caracteres "abc" e "abc" não são iguais, enquanto no SQL Server essas cadeias de caracteres são iguais.

  • Os tipos de dados de ponto flutuante XQuery suportam valores especiais de +/- zero e +/- infinito. Não há suporte para esses valores especiais nos tipos de dados de ponto flutuante do SQL Server.

Tipos XQuery em XML não tipado

  • Os tipos XQuery correspondem às expressões XQuery em todos os métodos do tipo de dados xml, incluindo o método value().

  • Os tipos XQuery suportam estas dicas de otimização: node(), SINGLETON, DATA TYPE e MAXLENGTH.

Para expressões XQuery sobre XML não tipado, você pode escolher entre dois modos de operação:

  • Modo de mapeamento padrão. Nesse modo, você especifica apenas o caminho ao criar um índice XML seletivo.

  • Modo de mapeamento especificado pelo usuário. Nesse modo, você especifica o caminho e as dicas de otimização opcionais.

O modo de mapeamento padrão usa uma opção de armazenamento conservadora, que é sempre segura e geral. Pode corresponder a qualquer tipo de expressão. Uma limitação do modo de mapeamento padrão é o desempenho abaixo do ideal, porque é necessário um número maior de conversões de tempo de execução e os índices secundários não estão disponíveis.

Aqui está um exemplo de um índice XML seletivo criado com mapeamentos padrão. Para todos os três caminhos, são utilizados o tipo de nó padrão (xs:untypedAtomic) e a cardinalidade.

CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
    mypath01 =  '/a/b',
    mypath02 = '/a/b/c',
    mypath03 = '/a/b/d'
);

O modo de mapeamento especificado pelo utilizador permite definir um tipo e cardinalidade para o nó, de modo a obter um melhor desempenho. No entanto, esse desempenho melhorado é alcançado abrindo mão da segurança - porque uma conversão pode falhar - e da generalidade - porque apenas o tipo especificado é correspondido com o índice XML seletivo.

Os tipos XQuery suportados para XML não tipado são:

  • xs:boolean
  • xs:double
  • xs:string
  • xs:date
  • xs:time
  • xs:dateTime

Se o tipo não for especificado, presume-se que o nó seja do tipo de dados xs:untypedAtomic.

Você pode otimizar o índice XML seletivo mostrado da seguinte maneira:

CREATE SELECTIVE XML INDEX example_sxi_UX_optimized
ON Tbl(xmlcol)
FOR
(
    mypath= '/a/b' as XQUERY 'node()',
    pathX = '/a/b/c' as XQUERY 'xs:double' SINGLETON,
    pathY = '/a/b/d' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON
);
-- mypath - Only the node value is needed; storage is saved.
-- pathX - Performance is improved; secondary indexes are possible.
-- pathY - Performance is improved; secondary indexes are possible; storage is saved.

Tipos do SQL Server em XML não tipado

  • Os tipos do SQL Server correspondem ao valor de retorno do método value().

  • Os tipos do SQL Server dão suporte a esta dica de otimização: SINGLETON.

Especificar um tipo é obrigatório para caminhos que retornam tipos do SQL Server. Use o mesmo tipo de SQL Server que você usaria no método value().

Considere a seguinte consulta:

SELECT T.record,
    T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;

A consulta especificada retorna um valor do caminho /a/b/d armazenado num tipo de dados NVARCHAR(200), pelo que o tipo de dados a especificar para o nó é óbvio. No entanto, não há nenhum esquema para especificar a cardinalidade do nó em XML não tipado. Para especificar que o nó d apareça no máximo uma vez sob seu nó pai b, crie um índice XML seletivo que use a dica de otimização SINGLETON da seguinte maneira:

CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
    node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);

Compreender o suporte a índices XML seletivos para XML tipado

XML digitado no SQL Server é um esquema associado a um determinado documento XML. O esquema define a estrutura geral do documento e os tipos de nós. Se existir um esquema, o Índice XML Seletivo aplicará a estrutura do esquema quando se promovem os caminhos, portanto, não há necessidade de especificar os tipos XQUERY para caminhos.

O Índice XML Seletivo suporta os seguintes tipos de XSD:

  • xs:anyUri
  • xs:boolean
  • xs:date
  • xs:dateTime
  • xs:day
  • xs:decimal
  • xs:double
  • xs:float
  • xs:int
  • xs:integer
  • xs:language
  • xs:long
  • xs:name
  • xs:NCName
  • xs:negativeInteger
  • xs:nmtoken
  • xs:nonNegativeInteger
  • xs:nonPositiveInteger
  • xs:positiveInteger
  • xs:qname
  • xs:short
  • xs:string
  • xs:time
  • xs:token
  • xs:unsignedByte
  • xs:unsignedInt
  • xs:unsignedLong
  • xs:unsignedShort

Quando um índice XML seletivo é criado sobre um documento que tem um esquema associado a ele, especificar um tipo XQuery na criação ou alteração do índice retorna um erro. O usuário pode usar anotações de tipo SQL na parte de promoção de caminho. O tipo SQL deve ser uma conversão válida do tipo XSD definido no esquema ou um erro é gerado. Todos os tipos SQL que têm representação adequada em XSD são suportados, com exceção dos tipos de data/hora.

Observação

O índice seletivo será usado se o tipo especificado na promoção de caminho do Índice XML Seletivo for o mesmo que o valor de retorno do método value().

As seguintes dicas de otimização podem ser usadas com documentos XML digitados:

  • node() dica de otimização.

  • A dica de otimização MAXLENGTH pode ser usada com os tipos xs:string para encurtar o valor indexado.

Para obter mais informações sobre dicas de otimização, consulte Especificando dicas de otimização.

Especificar caminhos

Um índice XML seletivo permite indexar apenas um subconjunto de nós dos dados XML armazenados que são relevantes para as consultas que você espera executar. Quando o subconjunto de nós relevantes é muito menor do que o número total de nós no documento XML, o índice XML seletivo armazena apenas os nós relevantes. Para se beneficiar de um índice XML seletivo, identifique o subconjunto correto de nós a serem indexados.

Escolha os nós para indexação

Você pode usar os dois princípios a seguir para identificar o subconjunto correto de nós a serem adicionados a um índice XML seletivo.

  1. Princípio 1: Para avaliar uma determinada expressão XQuery, indexe todos os nós que você precisa examinar.

    • Indexe todos os dos nós cuja existência ou valor é usado na expressão XQuery.

    • Indexe todos os nós na expressão XQuery na qual os predicados XQuery são aplicados.

    Considere a seguinte consulta sobre o documento XML de exemplo neste artigo:

    SELECT T.record FROM myXMLTable T
    WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;
    

    Para retornar as instâncias XML que satisfazem essa consulta, um índice XML seletivo precisa examinar dois nós em cada instância XML:

    • Node c, porque seu valor é usado na expressão XQuery.

    • b, porque um predicado é aplicado sobre o nó b numa expressão XQuery.

  2. Princípio 2: Para obter o melhor desempenho, indexe todos os nós necessários para avaliar uma determinada expressão XQuery. Se você indexar apenas alguns dos nós, o índice XML seletivo melhorará a avaliação de subexpressões que incluem apenas nós indexados.

Para melhorar o desempenho da instrução SELECT mostrada acima, você pode criar o seguinte índice XML seletivo:

CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
    path123 =  '/a/b',
    path124 =  '/a/b/c'
);

Indexar caminhos idênticos

Não é possível promover caminhos idênticos como o mesmo tipo de dados sob nomes de caminho diferentes. Por exemplo, a consulta a seguir gera um erro, porque pathOne e pathTwo são idênticos:

CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
    pathOne = 'book/authors/authorID' AS XQUERY 'xs:string',
    pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);

No entanto, você pode promover caminhos idênticos como tipos de dados diferentes com nomes diferentes. Por exemplo, a consulta a seguir agora é aceitável, porque os tipos de dados são diferentes:

CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
    pathOne = 'book/authors/authorID' AS XQUERY 'xs:double',
    pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);

Exemplos

Aqui estão mais alguns exemplos de seleção dos nós corretos para indexar para diferentes tipos de XQuery.

Exemplo 1

Aqui está um XQuery simples que usa o método exist():

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;

A tabela a seguir mostra os nós que devem ser indexados para permitir que essa consulta use o índice XML seletivo.

Nó a incluir no índice Motivo para indexar este nó
/a/b/c/d/e/h A existência de nó h é avaliada no método exist().

Exemplo 2

Aqui está uma variação mais complexa do XQuery anterior, com um predicado aplicado:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;

A tabela a seguir mostra os nós que devem ser indexados para permitir que essa consulta use o índice XML seletivo.

Nó a incluir no índice Motivo para indexar este nó
/a/b/c/d/e Um predicado é aplicado sobre o nó e.
/a/b/c/d/e/f O valor do nó f é avaliado dentro do predicado.

Exemplo 3

Aqui está uma consulta mais complexa com uma cláusula value():

SELECT T.record,
    T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;

A tabela a seguir mostra os nós que devem ser indexados para permitir que essa consulta use o índice XML seletivo.

Nó a incluir no índice Motivo para indexar este nó
/a/b/c/d/e Um predicado é aplicado sobre o nó e.
/a/b/c/d/e/f O valor do nó f é avaliado dentro do predicado.
/a/b/c/d/e/g O valor do nó g é retornado pelo método value().

Exemplo 4

Aqui está uma consulta que usa uma cláusula FLWOR dentro de uma cláusula exist(). (O nome FLWOR vem das cinco cláusulas que podem compor uma expressão XQuery FLWOR: for, let, where, order by e return.)

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('
  For $x in /a/b/c/d/e
  Where $x/f = "SQL"
  Return $x/g
') = 1;

A tabela a seguir mostra os nós que devem ser indexados para permitir que essa consulta use o índice XML seletivo.

Nó a incluir no índice Motivo para indexar este nó
/a/b/c/d/e A existência de nó e é avaliada na cláusula FLWOR.
/a/b/c/d/e/f O valor do nó f é avaliado na cláusula FLWOR.
/a/b/c/d/e/g A existência do nó g é avaliada pelo método exist().

Especificar dicas de otimização

Você pode usar dicas de otimização opcionais para especificar detalhes de mapeamento adicionais para um nó indexado por um índice XML seletivo. Por exemplo, você pode especificar o tipo de dados e a cardinalidade do nó e certas informações sobre a estrutura dos dados. Essas informações adicionais suportam um melhor mapeamento. Isso também resulta em melhorias no desempenho ou economia no armazenamento, ou ambos.

O uso de dicas de otimização é opcional. Você sempre pode aceitar os mapeamentos padrão, que são confiáveis, mas podem não fornecer desempenho e armazenamento ideais.

Algumas dicas de otimização, como a dica SINGLETON, introduzem restrições sobre seus dados. Em alguns casos, erros podem ser gerados quando essas restrições não são atendidas.

Benefícios das dicas de otimização

A tabela a seguir identifica as dicas de otimização que oferecem suporte a armazenamento mais eficiente ou melhor desempenho.

Dica de otimização Armazenamento mais eficiente Desempenho melhorado
nó() Sim Não
Padrão Singleton Não Sim
TIPO DE DADOS Sim Sim
COMPRIMENTO MÁXIMO Sim Sim

Dicas de otimização e tipos de dados

Você pode indexar nós como tipos de dados XQuery ou como tipos de dados do SQL Server. A tabela a seguir mostra quais dicas de otimização são suportadas com cada tipo de dados.

Dica de otimização Tipos de dados XQuery Tipos de dados SQL
nó() Sim Não
Padrão Singleton Sim Sim
TIPO DE DADOS Sim Não
COMPRIMENTO MÁXIMO Sim Não

Dica de otimização node()

Aplica-se a: tipos de dados XQuery

Você pode usar a otimização node() para especificar um nó cujo valor não é necessário na avaliação de uma consulta típica. Esta sugestão reduz os requisitos de armazenamento quando a consulta típica só precisa avaliar a existência do nó. (Por padrão, um índice XML seletivo armazena o valor de todos os nós promovidos, exceto tipos de nós complexos.)

Considere o seguinte exemplo:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;

Para usar um índice XML seletivo para avaliar essa consulta, promova nós b e c. No entanto, como o valor do nó b não é necessário, pode usar a sugestão para node() com a seguinte sintaxe:

`/a/b/ as node()

Se uma consulta requerer o valor de um nó indexado com a indicação node(), então o índice XML seletivo não poderá ser usado.

Dica de otimização "SINGLETON"

Aplica-se a: tipos de dados XQuery ou SQL Server

A dica de otimização SINGLETON especifica a cardinalidade de um nó. Essa dica melhora o desempenho da consulta, pois sabe-se de antemão que um nó aparece no máximo uma vez dentro de seu pai ou ancestral.

Considere o documento de exemplo XML neste artigo.

Para usar um índice XML seletivo para consultar este documento, você pode especificar a dica SINGLETON para o nó d uma vez que ele aparece no máximo uma vez dentro de seu pai.

Se a dica SINGLETON tiver sido especificada, mas um nó aparecer mais de uma vez dentro do respetivo pai ou ancestral, um erro será levantado quando criar o índice (para dados existentes) ou quando executar uma consulta (para novos dados).

DICA DE OTIMIZAÇÃO DO TIPO DE DADOS

Aplica-se a: tipos de dados XQuery

A dica de otimização DATA TYPE permite especificar um tipo de dados XQuery ou SQL Server para o nó indexado. O tipo de dados é usado para a coluna na tabela de dados do índice XML seletivo que corresponde ao nó indexado.

Quando a conversão de um valor existente para o tipo de dados especificado falha, a operação de inserção (no índice) não falha; no entanto, um valor nulo é inserido na tabela de dados do índice.

Dica de otimização MAXLENGTH

Aplica-se a: tipos de dados XQuery

A dica de otimização MAXLENGTH permite limitar o comprimento dos dados xs:string. MAXLENGTH não é relevante para tipos de dados do SQL Server, pois você especifica o comprimento quando especifica os tipos de data VARCHAR ou NVARCAR.

Quando uma cadeia de caracteres existente é maior do que o MAXLENGTH especificado, a inserção desse valor no índice falha.

Exemplo de documento XML para exemplos

O seguinte documento XML de exemplo é referenciado nos exemplos deste artigo:

<a>
    <b>
         <c atc="aa">10</c>
         <c atc="bb">15</c>
         <d atd1="dd" atd2="ddd">md </d>
    </b>
     <b>
        <c></c>
        <c atc="">117</c>
     </b>
</a>

Ver também