Sdílet prostřednictvím


Určení cest a nápovědy pro optimalizaci pro selektivní indexy XML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Tento článek popisuje, jak určit cesty uzlů k indexování a optimalizační návrhy pro indexování při vytváření nebo úpravě selektivních XML indexů.

Cesty uzlů a rady optimalizace zadáte současně v jednom z následujících příkazů:

Další informace o selektivních indexech XML naleznete v tématu selektivní indexy XML (SXI).

Pochopte typy XQuery a SQL Server v netypovaném XML

Selektivní indexy XML podporují dva systémy typů: typy XQuery a typy SQL Serveru. Indexovanou cestu lze použít buď ke shodě s výrazem XQuery, nebo ke shodě s návratovým typem value() metody xml datového typu.

  • Pokud cesta k indexu není opatřena poznámkami nebo je opatřena klíčovým slovem XQUERY, cesta odpovídá výrazu XQuery. Existují dvě varianty pro cesty uzlů označené XQUERY:

    • Pokud nezadáte klíčové slovo XQUERY a datový typ XQuery, použijí se výchozí mapování. Výkon a úložiště obvykle nejsou optimální.

    • Pokud zadáte klíčové slovo XQUERY a datový typ XQuery a volitelně další rady pro optimalizaci, můžete dosáhnout nejlepšího možného výkonu a nejúčinnějšího možného úložiště. Odlitek však může selhat.

  • Pokud je cesta k indexu anotována klíčovým slovem SQL, cesta odpovídá návratovém typu value() metody xml datového typu. Zadejte odpovídající datový typ SQL Serveru, což je návratový typ, který očekáváte od metody value().

Existují drobné rozdíly mezi typovým systémem XML výrazů XQuery a typovým systémem SQL Serveru použitým na metodu value() pro datový typ xml . Mezi tyto rozdíly patří:

  • Systém typů XQuery si je vědom koncových mezer. Například podle sémantiky typu XQuery se řetězce "abc" a "abc" nerovnají, zatímco v SQL Serveru jsou tyto řetězce stejné.

  • Datové typy XQuery s plovoucí desetinnou čárkou podporují speciální hodnoty +/- nula a +/- nekonečna. Tyto speciální hodnoty nejsou podporovány v datových typech s plovoucí desetinou čárkou SQL Serveru.

Typy XQuery v netypovaném XML

  • Typy XQuery odpovídají výrazům XQuery ve všech metodách xml datového typu včetně value() metody.

  • Typy XQuery podporují tyto rady optimalizace: node(), SINGLETON, DATA TYPE a MAXLENGTH.

U výrazů XQuery nad nezatypovaným kódem XML si můžete vybrat mezi dvěma režimy operace:

  • výchozí režim mapování. V tomto režimu zadáte pouze cestu při vytváření selektivního indexu XML.

  • režim mapování zadaný uživatelem. V tomto režimu zadáte cestu i volitelné rady optimalizace.

Výchozí režim mapování používá konzervativní možnost úložiště, která je vždy bezpečná a obecná. Může odpovídat libovolnému typu výrazu. Omezení výchozího režimu mapování je menší než optimální výkon, protože se vyžaduje vyšší počet přetypování za běhu a sekundární indexy nejsou k dispozici.

Tady je příklad selektivního indexu XML vytvořeného s výchozími mapováními. Pro všechny tři cesty se použije výchozí typ uzlu (xs:untypedAtomic) a kardinalita.

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

Režim mapování zadaný uživatelem umožňuje určit typ a kardinalitu uzlu, aby získal lepší výkon. Tento vylepšený výkon je však dosažen tím, že se obětuje bezpečnost, protože přetypování může selhat, a obecnost, protože pouze zadaný typ je použit se selektivním indexem XML.

Podporované XQuery typy pro netypovaná XML jsou:

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

Pokud typ není zadaný, předpokládá se, že uzel je datový typ xs:untypedAtomic.

Selektivní index XML zobrazený následujícím způsobem můžete optimalizovat:

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.

Typy SQL Serveru v nezatypovaném XML

  • Typy SQL Serveru odpovídají návratové hodnotě metody value().

  • Typy SQL Serveru podporují tuto nápovědu k optimalizaci: SINGLETON.

Zadání typu je povinné pro cesty, které vracejí typy SQL Serveru. Použijte stejný typ SQL Serveru, který byste použili v metodě value().

Představte si následující dotaz:

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

Zadaný dotaz vrátí hodnotu z cesty /a/b/d zabalenou do datového typu NVARCHAR(200), takže je zřejmé, jaký datový typ by měl být určen pro uzel. Neexistuje však žádné schéma pro určení kardinality uzlu v nezatypovaném kódu XML. Chcete-li určit, že uzel d se zobrazí nejvýše jednou pod jeho nadřazeným uzlem b, vytvořte selektivní index XML, který používá nápovědu pro optimalizaci SINGLETON následujícím způsobem:

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

Pochopte podporu selektivního XML indexu pro typ XML

Typ XML v SQL Serveru je schéma přidružené k danému dokumentu XML. Schéma definuje celkovou strukturu dokumentů a typy uzlů. Pokud schéma existuje, použije selektivní index XML strukturu schématu, když uživatel podporuje cesty, takže není nutné zadat typy XQUERY pro cesty.

Selektivní index XML podporuje následující typy 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

Při vytvoření selektivního indexu XML v dokumentu, který má přidružené schéma, zadání typu XQuery při vytvoření indexu nebo změna vrátí chybu. V části propagace cesty může uživatel použít poznámky typu SQL. Typ SQL musí být platným převodem z typu XSD definovaného ve schématu, jinak dojde k chybě. Všechny typy SQL, které mají odpovídající reprezentaci v XSD, jsou podporovány s výjimkou typů data a času.

Poznámka

Selektivní index se použije, pokud je typ specifikovaný v propagaci cesty selektivního XML indexu stejný jako návratová hodnota metody value().

Následující rady optimalizace lze použít se zadanými dokumenty XML:

  • node() radu k optimalizaci.

  • Nápovědu k optimalizaci MAXLENGTH lze použít s typy xs:string ke zkrácení indexované hodnoty.

Další informace o nápovědě k optimalizaci naleznete v tématu Určení tipů optimalizace.

Určete cesty

Selektivní index XML umožňuje indexovat pouze podmnožinu uzlů z uložených dat XML, která jsou relevantní pro dotazy, které očekáváte ke spuštění. Pokud je podmnožina relevantních uzlů mnohem menší než celkový počet uzlů v dokumentu XML, selektivní index XML ukládá pouze relevantní uzly. Pokud chcete využít selektivního indexu XML, identifikujte správnou podmnožinu uzlů, které se mají indexovat.

Zvolte uzly, které se mají indexovat.

Pomocí následujících dvou principů můžete identifikovat správnou podmnožinu uzlů, které chcete přidat do selektivního indexu XML.

  1. princip 1: Pokud chcete vyhodnotit daný výraz XQuery, indexujte všechny uzly, které potřebujete prozkoumat.

    • Indexujte všechny uzly, jejichž existence nebo hodnota se používá ve výrazu XQuery.

    • Indexujte všechny uzly ve výrazu XQuery, na kterém se použijí predikáty XQuery.

    Zvažte následující dotaz nad ukázkovým dokumentem XML v tomto článku:

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

    Aby bylo možné vrátit instance XML, které splňují tento dotaz, musí selektivní index XML zkoumat dva uzly v každé instanci XML:

    • Node c, protože jeho hodnota se používá ve výrazu XQuery.

    • Uzel b, protože predikát je použit na uzelb ve výrazu XQuery.

  2. princip 2: Pro zajištění nejlepšího výkonu indexujte všechny uzly potřebné k vyhodnocení daného výrazu XQuery. Pokud indexujete pouze některé uzly, selektivní index XML zlepšuje vyhodnocení dílčích výrazů, které zahrnují pouze indexované uzly.

Pokud chcete zvýšit výkon výše uvedeného příkazu SELECT, můžete vytvořit následující selektivní index XML:

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

Indexování identických cest

Nemůžete označovat stejné cesty jako stejný datový typ pod různými názvy cest. Například následující dotaz vyvolá chybu, protože pathOne a pathTwo jsou stejné:

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'
);

Stejné cesty ale můžete propagovat jako různé datové typy s různými názvy. Například následující dotaz je teď přijatelný, protože datové typy se liší:

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'
);

Příklady

Tady je několik dalších příkladů výběru správných uzlů pro indexování pro různé typy XQuery.

Příklad 1

Tady je jednoduchý XQuery, který používá metodu exist():

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

Následující tabulka ukazuje uzly, které by měly být indexovány, aby tento dotaz používal selektivní index XML.

Uzel, který se má zahrnout do indexu Důvod indexování tohoto uzlu
/a/b/c/d/e/h Existence h uzlu se vyhodnocuje v metodě exist().

Příklad 2

Tady je složitější varianta předchozího XQuery s použitým predikátem:

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

Následující tabulka ukazuje uzly, které by měly být indexovány, aby tento dotaz používal selektivní index XML.

Uzel, který se má zahrnout do indexu Důvod indexování tohoto uzlu
/a/b/c/d/e Predikát se použije na uzlu e.
/a/b/c/d/e/f Hodnota f uzlu se vyhodnocuje uvnitř predikátu.

Příklad 3

Tady je složitější dotaz s klauzulí value():

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

Následující tabulka ukazuje uzly, které by měly být indexovány, aby tento dotaz používal selektivní index XML.

Uzel, který se má zahrnout do indexu Důvod indexování tohoto uzlu
/a/b/c/d/e Predikát se aplikuje na uzel e.
/a/b/c/d/e/f Hodnota f uzlu se vyhodnocuje uvnitř predikátu.
/a/b/c/d/e/g Hodnota g uzlu je vrácena metodou value().

Příklad 4

Tady je dotaz, který používá klauzuli FLWOR uvnitř klauzule exist(). (Název FLWOR pochází z pěti klauzulí, které mohou vytvořit výraz XQuery FLWOR: for, let, where, order by a 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;

Následující tabulka ukazuje uzly, které by měly být indexovány, aby tento dotaz používal selektivní index XML.

Uzel, který se má zahrnout do indexu Důvod indexování tohoto uzlu
/a/b/c/d/e Existence e uzlu se vyhodnocuje v klauzuli FLWOR.
/a/b/c/d/e/f Hodnota f uzlu se vyhodnocuje v klauzuli FLWOR.
/a/b/c/d/e/g Existence g uzlu se vyhodnocuje metodou exist().

Určení tipů pro optimalizaci

Pomocí volitelných tipů pro optimalizaci můžete zadat další podrobnosti mapování uzlu indexovaného selektivním indexem XML. Můžete například zadat datový typ a kardinalitu uzlu a určité informace o struktuře dat. Tyto další informace podporují lepší mapování. Výsledkem je také zlepšení výkonu nebo úspor v úložišti nebo obojí.

Použití tipů pro optimalizaci je volitelné. Vždy můžete přijmout výchozí mapování, která jsou spolehlivá, ale nemusí poskytovat optimální výkon a úložiště.

Některé rady optimalizace, jako je například nápověda SINGLETON, představují omezení vašich dat. V některých případech můžou být chyby vyvolány v případě, že tato omezení nejsou splněna.

Výhody tipů pro optimalizaci

Následující tabulka uvádí rady optimalizace, které podporují efektivnější úložiště nebo vyšší výkon.

Nápověda k optimalizaci Efektivnější úložiště Vylepšený výkon
node() Ano Ne
SINGLETON Ne Ano
typ dat Ano Ano
MAXLENGTH Ano Ano

Rady pro optimalizaci a datové typy

Uzly můžete indexovat jako datové typy XQuery nebo jako datové typy SQL Serveru. Následující tabulka ukazuje, které rady optimalizace jsou podporovány s každým datovým typem.

Nápověda k optimalizaci Datové typy XQuery Datové typy SQL
node() Ano Ne
SINGLETON Ano Ano
typ dat Ano Ne
MAXLENGTH Ano Ne

Nápověda pro optimalizaci node()

Platí pro: datové typy XQuery

Optimalizaci node() můžete použít k určení uzlu, jehož hodnota není nutná k vyhodnocení typického dotazu. Tento tip snižuje požadavky na úložiště, když typický dotaz musí vyhodnotit pouze existenci uzlu. (Ve výchozím nastavení selektivní index XML ukládá hodnotu pro všechny propagované uzly s výjimkou komplexních typů uzlů.)

Podívejte se na následující příklad:

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

Chcete-li k vyhodnocení tohoto dotazu použít selektivní index XML, upřednostníte uzly b a c. Vzhledem k tomu, že hodnota b uzlu není nutná, můžete použít node() nápovědu s následující syntaxí:

`/a/b/ as node()

Pokud dotaz vyžaduje hodnotu uzlu indexovaného pomocí nápovědy node(), nejde použít selektivní index XML.

Nápověda pro optimalizaci SINGLETON

platí pro: datové typy XQuery nebo SQL Server

Tip optimalizace SINGLETON určuje kardinalitu uzlu. Tento náznak zlepšuje výkon dotazů, protože je předem známo, že uzel se zobrazuje nejvýše jednou v rámci svého nadřazeného uzlu nebo předka.

Zvažte ukázkový dokument XML v tomto článku.

Chcete-li použít selektivní index XML k dotazování tohoto dokumentu, můžete zadat hint SINGLETON pro uzel d, protože se zobrazuje nejvýše jednou v rámci rodičovského prvku.

Pokud byla specifikovaná nápověda SINGLETON, ale uzel se zobrazuje vícekrát v rámci svého rodiče nebo předka, je vyvolána chyba při vytváření indexu (pro existující data) nebo při spuštění dotazu (pro nová data).

Nápověda k optimalizaci DATOVÝCH TYPŮ

Platí pro: datové typy XQuery

Nápověda k optimalizaci datového typu umožňuje zadat datový typ XQuery nebo SQL Server pro indexovaný uzel. Datový typ se používá pro sloupec v tabulce dat selektivního indexu XML, který odpovídá indexovaného uzlu.

Při přetypování existující hodnoty na zadaný datový typ selže operace vložení (do indexu) se nezdaří; Hodnota null je však vložena do datové tabulky indexu.

Rada pro optimalizaci MAXLENGTH

platí pro: datové typy XQuery

Nápověda k optimalizaci MAXLENGTH umožňuje omezit délku dat xs:string. MAXLENGTH není relevantní pro datové typy SQL Serveru, protože zadáte délku při zadávání datových typů VARCHAR nebo NVARCHAR.

Pokud je existující řetězec delší než zadaný maxLENGTH, vložení této hodnoty do indexu selže.

Ukázkový dokument XML pro příklady

Následující ukázkový dokument XML je odkazován v příkladech v tomto článku:

<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>

Viz také