Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
azure 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ů:
V klauzuli příkazu CREATE typu FOR. Další informace naleznete v tématu CREATE SELECTIVE XML INDEX (Transact-SQL).
V klauzuli ADD příkazu ALTER. Další informace naleznete v tématu ALTER INDEX (selektivní indexy XML).
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 metodyvalue()
.
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.
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.
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>