Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
I den här artikeln beskrivs hur du anger nodsökvägar för indexering och optimeringstips för indexering när du skapar eller ändrar selektiva XML-index.
Du anger nodsökvägar och optimeringstips samtidigt i någon av följande instruktioner:
I uttrycket FOR i en CREATE-instruktion. Mer information finns i CREATE SELECTIVE XML INDEX (Transact-SQL).
I klausulen ADD i en ALTER-klausul. Mer information finns i ALTER INDEX (selektiva XML-index).
Mer information om selektiva XML-index finns i SXI (Selective XML Indexes).
Förstå XQuery- och SQL Server-typer i otypad XML
Selektiva XML-index stöder två typsystem: XQuery-typer och SQL Server-typer. Den indexerade sökvägen kan användas antingen för att matcha ett XQuery-uttryck eller för att matcha returtypen för value()-metoden för xml- datatyp.
När en sökväg till index inte kommenteras eller kommenteras med nyckelordet XQUERY matchar sökvägen ett XQuery-uttryck. Det finns två varianter för XQUERY-kommenterade nodsökvägar:
Om du inte anger nyckelordet XQUERY och datatypen XQuery används standardmappningar. Prestanda och lagring är vanligtvis inte optimala.
Om du anger nyckelordet XQUERY och XQuery-datatypen och eventuellt andra optimeringstips kan du uppnå bästa möjliga prestanda och mest effektiva lagring. En rollbesättning kan dock misslyckas.
När en väg till indexet markeras med SQL-nyckelordet, matchar vägen returtypen för
value()-metoden i XML-datatypen . Ange lämplig SQL Server-datatyp, vilket är den returtyp som du förväntar dig av metodenvalue().
Det finns subtila skillnader mellan XML-typsystemet för XQuery-uttryck och det SQL Server-typsystem som tillämpas på value()-metoden för XML- datatyp. Dessa skillnader omfattar följande:
XQuery-typsystemet är medvetet om avslutande blanksteg. Enligt semantik av XQuery-typ är till exempel strängarna "abc" och "abc" inte lika, medan strängarna i SQL Server är lika.
XQuery-flyttalsdatatyper har stöd för specialvärdena +/- noll och +/- oändlighet. Dessa specialvärden stöds inte i SQL Server-flyttalsdatatyperna.
XQuery-typer i otypad XML
XQuery-typer matchar XQuery-uttryck i alla metoder i xml- datatyp, inklusive metoden
value().XQuery-typer stöder dessa optimeringstips: node(), SINGLETON, DATA TYPE och MAXLENGTH.
För XQuery-uttryck över otypad XML kan du välja mellan två åtgärdslägen:
Standardmappningsläge. I det här läget anger du endast sökvägen när du skapar ett selektivt XML-index.
användardefingivet mappningsläge. I det här läget anger du både sökvägen och valfria optimeringstips.
Standardmappningsläget använder ett konservativt lagringsalternativ, som alltid är säkert och allmänt. Den kan matcha vilken uttryckstyp som helst. En begränsning i standardmappningsläget är mindre än optimala prestanda, eftersom ett ökat antal runtime-avgjutningar krävs och sekundära index inte är tillgängliga.
Här är ett exempel på ett selektivt XML-index som skapats med standardmappningar. För alla tre sökvägar används standardnodtypen (xs:untypedAtomic) och kardinalitet.
CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
mypath01 = '/a/b',
mypath02 = '/a/b/c',
mypath03 = '/a/b/d'
);
Med det användardefinierade mappningsläget kan du ange en typ och kardinalitet för noden för att få bättre prestanda. Den här förbättrade prestandan uppnås dock genom att ge upp säkerheten - eftersom en omvandling kan misslyckas - och allmängiltighet - eftersom endast den angivna typen matchas med det selektiva XML-indexet.
De XQuery-typer som stöds för otypade XML-fall är:
xs:booleanxs:doublexs:stringxs:datexs:timexs:dateTime
Om typen inte anges antas noden vara av xs:untypedAtomic datatyp.
Du kan optimera det selektiva XML-index som visas på följande sätt:
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.
SQL Server-typer i ostrukturerad XML
SQL Server-typer matchar returvärdet för metoden
value().SQL Server-typer stöder det här optimeringstipset: SINGLETON.
Det är obligatoriskt att ange en typ för sökvägar som returnerar SQL Server-typer. Använd samma SQL Server-typ som du skulle använda i metoden value().
Överväg följande fråga:
SELECT T.record,
T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;
Den angivna frågan returnerar ett värde från sökvägen /a/b/d packad till en NVARCHAR(200) datatyp, så datatypen som ska anges för noden är uppenbar. Det finns dock inget schema för att ange nodens kardinalitet i otypad XML. Om du vill ange att noden d visas högst en gång under den överordnade noden bskapar du ett selektivt XML-index som använder SINGLETON-optimeringstipset på följande sätt:
CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);
Förstå stöd för selektivt XML-index för typad XML
Inskriven XML i SQL Server är ett schema som är associerat med ett visst XML-dokument. Schemat definierar övergripande dokumentstruktur och typer av noder. Om ett schema finns tillämpar Selektiv XML-index schemastrukturen när användaren höjer upp sökvägar, så det finns inget behov av att ange XQUERY-typerna för sökvägar.
Selektivt XML-index stöder följande XSD-typer:
xs:anyUrixs:booleanxs:datexs:dateTimexs:dayxs:decimalxs:doublexs:floatxs:intxs:integerxs:languagexs:longxs:namexs:NCNamexs:negativeIntegerxs:nmtokenxs:nonNegativeIntegerxs:nonPositiveIntegerxs:positiveIntegerxs:qnamexs:shortxs:stringxs:timexs:tokenxs:unsignedBytexs:unsignedIntxs:unsignedLongxs:unsignedShort
När ett selektivt XML-index skapas över ett dokument som har ett schema associerat med det returneras ett fel om du anger en XQuery-typ när index skapas eller ändras. Användaren kan använda SQL-typanteckningar i sökvägshöjningsdelen. SQL-typen måste vara en giltig konvertering från den XSD-typ som definierats i schemat, eller så utlöses ett fel. Alla SQL-typer som har tillräcklig representation i XSD stöds, med undantag för datum-/tidstyper.
Not
Det selektiva indexet används om den typ som anges i promotionen av den selektiva XML-indexvägen är densamma som returvärdet för value()-metoden.
Följande optimeringstips kan användas med inskrivna XML-dokument:
node()optimeringsledtråd.MAXLENGTH-optimeringstips kan användas med xs:string-typer för att förkorta det indexerade värdet.
Mer information om optimeringstips finns i Ange optimeringstips.
Ange sökvägar
Med ett selektivt XML-index kan du endast indexeras en delmängd noder från lagrade XML-data som är relevanta för de frågor som du förväntar dig att köra. När delmängden av relevanta noder är mycket mindre än det totala antalet noder i XML-dokumentet lagrar det selektiva XML-indexet endast relevanta noder. Om du vill dra nytta av ett selektivt XML-index identifierar du rätt delmängd av noder som ska indexeras.
Välj de noder som ska indexeras
Du kan använda följande två principer för att identifiera rätt delmängd av noder som ska läggas till i ett selektivt XML-index.
Princip 1: Indexera alla noder som du behöver undersöka om du vill utvärdera ett visst XQuery-uttryck.
Indexera alla noder vars existens eller värde används i XQuery-uttrycket.
Indexera alla noder i XQuery-uttrycket där XQuery-predikat tillämpas.
Överväg följande fråga i samband med exempeldokumentet för XML i den här artikeln:
SELECT T.record FROM myXMLTable T WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;För att kunna returnera DE XML-instanser som uppfyller den här frågan måste ett selektivt XML-index undersöka två noder i varje XML-instans:
Node
c, eftersom dess värde används i XQuery-uttrycket.Node
b, eftersom ett predikat tillämpas över nodenbi XQuery-uttrycket.
Princip 2: Indexera alla noder som krävs för att utvärdera ett visst XQuery-uttryck för bästa prestanda. Om du bara indexar några av noderna förbättrar det selektiva XML-indexet utvärderingen av underuttryck som endast innehåller indexerade noder.
För att förbättra prestandan för SELECT-instruktionen som visas ovan kan du skapa följande selektiva XML-index:
CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
path123 = '/a/b',
path124 = '/a/b/c'
);
Index identiska sökvägar
Du kan inte höja upp identiska sökvägar som samma datatyp under olika sökvägsnamn. Följande fråga genererar till exempel ett fel eftersom pathOne och pathTwo är identiska:
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'
);
Du kan dock behandla identiska sökvägar som olika datatyper med olika namn. Till exempel är följande fråga nu acceptabel eftersom datatyperna skiljer sig åt:
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'
);
Exempel
Här följer några fler exempel på hur du väljer rätt noder att indexera för olika XQuery-typer.
Exempel 1
Här är en enkel XQuery som använder metoden exist():
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;
I följande tabell visas de noder som ska indexeras för att den här frågan ska kunna använda det selektiva XML-indexet.
| Nod som ska inkluderas i indexet | Orsak till indexering av den här noden |
|---|---|
| /a/b/c/d/e/h | Förekomsten av nod h utvärderas i metoden exist(). |
Exempel 2
Här är en mer komplex variant av den tidigare XQuery, med ett predikat tillämpat:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;
I följande tabell visas de noder som ska indexeras för att den här frågan ska kunna använda det selektiva XML-indexet.
| Nod som ska inkluderas i indexet | Orsak till indexering av den här noden |
|---|---|
| /a/b/c/d/e | Ett predikat tillämpas över nod e. |
| /a/b/c/d/e/f | Värdet för nod f utvärderas i predikatet. |
Exempel 3
Här är en mer komplex fråga med en value()-sats:
SELECT T.record,
T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;
I följande tabell visas de noder som ska indexeras för att den här frågan ska kunna använda det selektiva XML-indexet.
| Nod som ska inkluderas i indexet | Orsak till indexering av den här noden |
|---|---|
| /a/b/c/d/e | Ett predikat tillämpas över nod e. |
| /a/b/c/d/e/f | Värdet för nod f utvärderas i predikatet. |
| /a/b/c/d/e/g | Värdet för nod g returneras av metoden value(). |
Exempel 4
Här är en fråga som använder en FLWOR-sats i en exist()-sats. (Namnet FLWOR kommer från de fem satser som kan utgöra ett XQuery FLWOR-uttryck: för, let, where, order by och 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;
I följande tabell visas de noder som ska indexeras för att den här frågan ska kunna använda det selektiva XML-indexet.
| Nod som ska inkluderas i indexet | Orsak till indexering av den här noden |
|---|---|
| /a/b/c/d/e | Förekomsten av nod e utvärderas i FLWOR-satsen. |
| /a/b/c/d/e/f | Värdet för nod f utvärderas i FLWOR-satsen. |
| /a/b/c/d/e/g | Förekomsten av nod g utvärderas med metoden exist(). |
Ange optimeringsförslag
Du kan använda valfria optimeringstips för att ange ytterligare mappningsinformation för en nod som indexeras av ett selektivt XML-index. Du kan till exempel ange nodens datatyp och kardinalitet och viss information om datastrukturen. Den här ytterligare informationen stöder bättre mappning. Det resulterar också i förbättringar i prestanda eller besparingar i lagring, eller både och.
Användning av optimeringstips är valfritt. Du kan alltid acceptera standardmappningarna, som är tillförlitliga men kanske inte ger optimala prestanda och lagring.
Vissa optimeringstips, till exempel SINGLETON-tipset, medför begränsningar för dina data. I vissa fall kan fel uppstå när dessa begränsningar inte uppfylls.
Fördelar med optimeringstips
I följande tabell identifieras de optimeringstips som stöder effektivare lagring eller bättre prestanda.
| Tips om optimering | Effektivare lagring | Förbättrad prestanda |
|---|---|---|
| node() | Ja | Nej |
| Singleton | Nej | Ja |
| DATATYP | Ja | Ja |
| MAXLENGTH | Ja | Ja |
Optimeringstips och datatyper
Du kan indexera noder som XQuery-datatyper eller som SQL Server-datatyper. I följande tabell visas vilka optimeringstips som stöds för varje datatyp.
| Tips om optimering | XQuery-datatyper | SQL-datatyper |
|---|---|---|
| node() | Ja | Nej |
| Singleton | Ja | Ja |
| DATATYP | Ja | Nej |
| MAXLENGTH | Ja | Nej |
node() optimeringsanvisning
gäller för: XQuery-datatyper
Du kan använda node() optimering för att ange en nod vars värde inte krävs för att utvärdera den typiska frågan. Det här tipset minskar lagringskraven när den vanliga frågan bara behöver utvärdera nodens existens. (Som standard lagrar ett selektivt XML-index värdet för alla upphöjda noder, förutom komplexa nodtyper.)
Tänk på följande exempel:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;
Om du vill använda ett selektivt XML-index för att utvärdera den här frågan höjer du upp noder b och c. Men eftersom värdet för nod b inte krävs kan du använda node() tips med följande syntax:
`/a/b/ as node()
Om en fråga kräver värdet för en nod som har indexerats med node() tips kan det selektiva XML-indexet inte användas.
Optimeringstips för singleton-mönster
gäller för: XQuery- eller SQL Server-datatyper
Singleton-optimeringstipset anger kardinaliteten för en nod. Det här tipset förbättrar frågeprestanda eftersom det är känt i förväg att en nod visas högst en gång inom sin förälder eller förfader.
Tänk på XML-exempeldokumentet i den här artikeln.
Om du vill använda ett selektivt XML-index för att fråga det här dokumentet kan du ange SINGLETON-tipset för nod d eftersom det visas högst en gång inom dess överordnade.
Om SINGLETON-tipset har angetts, men en nod visas mer än en gång inom sin förälder eller förfäder, utlöses ett fel när du skapar indexet (för de befintliga data) eller när du kör en fråga (för de nya data).
Tips om optimering av DATATYP
gäller för: XQuery-datatyper
Med optimeringstipset FÖR DATATYP kan du ange en XQuery eller en SQL Server-datatyp för den indexerade noden. Datatypen används för kolumnen i datatabellen för det selektiva XML-index som motsvarar den indexerade noden.
När det inte går att omvandla ett befintligt värde till den angivna datatypen misslyckas inte infogningsåtgärden (i indexet). Ett null-värde infogas dock i indexets datatabell.
TIPS för MAXLENGTH-optimering
gäller för: XQuery-datatyper
Med MAXLENGTH-optimeringstipset kan du begränsa längden på xs:string-data. MAXLENGTH är inte relevant för SQL Server-datatyper eftersom du anger längden när du anger datumtyperna VARCHAR eller NVARCHAR.
När en befintlig sträng är längre än den angivna MAXLENGTH misslyckas infogningen av det värdet i indexet.
Exempel för XML-dokument
Följande XML-exempeldokument refereras till i exemplen i den här artikeln:
<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>