Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
In dit artikel wordt beschreven hoe u knooppuntpaden en optimalisatie-aanwijzingen voor indexering opgeeft bij het maken of wijzigen van selectieve XML-indexen.
U geeft knooppuntpaden en optimalisatiehints op hetzelfde moment op in een van de volgende instructies:
In de FOR-clausule van een CREATE-statement. Zie CREATE SELECTIVE XML INDEX (Transact-SQL)voor meer informatie.
In de component ADD van een ALTER-instructie. Zie ALTER INDEX (Selectieve XML-indexen)voor meer informatie.
Zie voor meer informatie over selectieve XML-indexen Selectieve XML-indexen (SXI).
XQuery- en SQL Server-typen in niet-getypte XML begrijpen
Selectieve XML-indexen ondersteunen twee typesystemen: XQuery-typen en SQL Server-typen. Het geïndexeerde pad kan worden gebruikt om overeen te komen met een XQuery-expressie of om het retourtype van de value()
methode van het xml- gegevenstype te vinden.
Wanneer een pad naar index niet is geannoteerd of wordt geannoteerd met het trefwoord XQUERY, komt het pad overeen met een XQuery-expressie. Er zijn twee variaties voor XQUERY-geannoteerde knooppuntpaden:
Als u het trefwoord XQUERY en het XQuery-gegevenstype niet opgeeft, worden standaardtoewijzingen gebruikt. Prestaties en opslag zijn doorgaans niet optimaal.
Als u het trefwoord XQUERY en het XQuery-gegevenstype en eventueel andere optimalisatiehints opgeeft, kunt u de best mogelijke prestaties en de meest efficiënte opslag bereiken. Een cast kan echter mislukken.
Wanneer een pad naar index wordt geannoteerd met het SQL-trefwoord, komt het pad overeen met het retourtype van de
value()
methode van het XML- gegevenstype. Geef het juiste SQL Server-gegevenstype op. Dit is het retourtype dat u van devalue()
-methode verwacht.
Er zijn subtiele verschillen tussen het XML-typesysteem XQuery-expressies en het SQL Server-typesysteem dat is toegepast op de value()
methode van het xml- gegevenstype. Deze verschillen zijn onder andere:
Het XQuery-typesysteem houdt rekening met spaties aan het einde. Volgens de typensemantiek van XQuery zijn de tekenreeksen "abc" en "abc " bijvoorbeeld niet gelijk, terwijl deze tekenreeksen in SQL Server wel gelijk zijn.
XQuery-gegevenstypen voor drijvendekomma ondersteunen speciale waarden van +/- nul en +/- oneindigheid. Deze speciale waarden worden niet ondersteund in de drijvendekommagegevenstypen van SQL Server.
XQuery-typen in niet-getypte XML
XQuery-typen komen overeen met XQuery-expressies in alle methoden van het xml- gegevenstype, inclusief de
value()
methode.XQuery-typen ondersteunen deze optimalisatiehints: node(), SINGLETON, GEGEVENSTYPE en MAXLENGTH.
Voor XQuery-expressies over niet-getypte XML kunt u kiezen tussen twee bewerkingsmodi:
standaard mappingmodus. In deze modus geeft u alleen het pad op bij het maken van een selectieve XML-index.
Door gebruikers opgegeven toewijzingsmodus. In deze modus geeft u zowel het pad als optionele optimalisatiehints op.
De standaardinstelling maakt gebruik van een conservatieve opslagoptie, die altijd veilig en universeel is. Het kan overeenkomen met elk expressietype. Een beperking van de standaard toewijzingsmodus is verminderde prestatie, omdat er een verhoogd aantal runtimecasts vereist is en secundaire indexen zijn niet beschikbaar.
Hier volgt een voorbeeld van een selectieve XML-index die is gemaakt met standaardtoewijzingen. Voor alle drie de paden worden het standaardknooppunttype (xs:untypedAtomic) en kardinaliteit gebruikt.
CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
mypath01 = '/a/b',
mypath02 = '/a/b/c',
mypath03 = '/a/b/d'
);
Met de gebruikersgespecificeerde toewijzingsmodus kunt u een type en kardinaliteit opgeven voor het knooppunt om betere prestaties te verkrijgen. Deze verbeterde prestaties worden echter bereikt door veiligheid op te geven - omdat een cast kan mislukken - en generaliteit - omdat alleen het opgegeven type overeenkomt met de selectieve XML-index.
De XQuery-typen die worden ondersteund voor niet-getypte XML-aanvragen zijn:
xs:boolean
xs:double
xs:string
xs:date
xs:time
xs:dateTime
Als het type niet is opgegeven, wordt ervan uitgegaan dat het knooppunt van het xs:untypedAtomic
gegevenstype is.
U kunt de selectieve XML-index optimaliseren die op de volgende manier wordt weergegeven:
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-typen in niet-getypte XML
SQL Server-typen komen overeen met de retourwaarde van de
value()
-methode.SQL Server-typen ondersteunen deze optimalisatiehint: SINGLETON.
Het opgeven van een type is verplicht voor paden die SQL Server-typen retourneren. Gebruik hetzelfde SQL Server-type dat u in de value()
-methode zou gebruiken.
Houd rekening met de volgende query:
SELECT T.record,
T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;
De opgegeven query retourneert een waarde van het pad /a/b/d
verpakt in een NVARCHAR(200) gegevenstype, zodat het gegevenstype dat moet worden opgegeven voor het knooppunt duidelijk is. Er is echter geen schema om de kardinaliteit van het knooppunt op te geven in niet-getypte XML. Als u wilt opgeven dat knooppunt d
maximaal één keer wordt weergegeven onder het bovenliggende knooppunt b
, maakt u als volgt een selectieve XML-index die gebruikmaakt van de hint voor SINGLETON-optimalisatie:
CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);
Meer informatie over ondersteuning voor selectieve XML-indexen voor getypte XML
Getypte XML in SQL Server is een schema dat is gekoppeld aan een bepaald XML-document. Het schema definieert de algemene documentstructuur en typen knooppunten. Als er een schema bestaat, past selectieve XML-index de schemastructuur toe wanneer de gebruiker paden bevordert. U hoeft dus niet de XQUERY-typen voor paden op te geven.
Selectieve XML-index ondersteunt de volgende XSD-typen:
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
Wanneer een selectieve XML-index wordt aangemaakt over een document waaraan een schema is gekoppeld, leidt het specificeren van een XQuery-type bij het aanmaken van de index of het wijzigen daarvan tot een foutmelding. De gebruiker kan SQL-typeaantekeningen gebruiken in het padpromotiegedeelte. Het SQL-type moet een geldige conversie zijn van het XSD-type dat in het schema is gedefinieerd, of er wordt een fout gegenereerd. Alle SQL-typen met voldoende weergave in XSD worden ondersteund, met uitzondering van datum-/tijdtypen.
Notitie
De selectieve index wordt gebruikt als het type dat is opgegeven in de promotie van het selectieve XML-indexpad hetzelfde is als de value()
methode retourwaarde.
De volgende optimalisatiehints kunnen worden gebruikt met getypte XML-documenten:
node()
optimalisatie-hint.MAXLENGTH-optimalisatiehint kan worden gebruikt met xs:string-typen om de geïndexeerde waarde te verkorten.
Zie Optimalisatiehints opgevenvoor meer informatie over optimalisatiehints.
Paden opgeven
Met een selectieve XML-index kunt u alleen een subset van knooppunten indexeren op basis van de opgeslagen XML-gegevens die relevant zijn voor de query's die u verwacht uit te voeren. Wanneer de subset van relevante knooppunten veel kleiner is dan het totale aantal knooppunten in het XML-document, slaat de selectieve XML-index alleen de relevante knooppunten op. Als u wilt profiteren van een selectieve XML-index, identificeert u de juiste subset van knooppunten die u wilt indexeren.
Kies de knooppunten die u wilt indexeren
U kunt de volgende twee principes gebruiken om de juiste subset van knooppunten te identificeren die moeten worden toegevoegd aan een selectieve XML-index.
Principe 1: als u een bepaalde XQuery-expressie wilt evalueren, moet u alle knooppunten indexeren die u moet onderzoeken.
Indexeer alle knooppunten waarvan het bestaan of de waarde wordt gebruikt in de XQuery-expressie.
Indexeer alle knooppunten in de XQuery-expressie waarop XQuery-predicaten worden toegepast.
Houd rekening met de volgende query over het voorbeeld-XML-document in dit artikel:
SELECT T.record FROM myXMLTable T WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;
Als u de XML-exemplaren wilt retourneren die aan deze query voldoen, moet een selectieve XML-index twee knooppunten in elk XML-exemplaar onderzoeken:
Node
c
, omdat de waarde wordt gebruikt in de XQuery-expressie.Knooppunt
b
, omdat een predicaat wordt toegepast op knooppuntb
in de XQuery-expressie.
Principle 2: Indexeer voor de beste prestaties alle knooppunten die nodig zijn om een bepaalde XQuery-expressie te evalueren. Als u slechts enkele knooppunten indexeren, verbetert de selectieve XML-index de evaluatie van subexpressies die alleen geïndexeerde knooppunten bevatten.
Als u de prestaties van de hierboven weergegeven SELECT-instructie wilt verbeteren, kunt u de volgende selectieve XML-index maken:
CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
path123 = '/a/b',
path124 = '/a/b/c'
);
Identieke paden indexeren
U kunt identieke paden niet als hetzelfde gegevenstype onder verschillende padnamen promoten. Met de volgende query wordt bijvoorbeeld een fout gegenereerd, omdat pathOne
en pathTwo
identiek zijn:
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'
);
U kunt echter identieke paden promoveren als verschillende gegevenstypen met verschillende namen. De volgende query is nu bijvoorbeeld acceptabel, omdat de gegevenstypen verschillend zijn:
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'
);
Voorbeelden
Hier volgen nog enkele voorbeelden van het selecteren van de juiste knooppunten om te indexeren voor verschillende XQuery-typen.
Voorbeeld 1
Hier volgt een eenvoudige XQuery die gebruikmaakt van de methode exist()
:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;
In de volgende tabel ziet u de knooppunten die moeten worden geïndexeerd om deze query de selectieve XML-index te laten gebruiken.
Knooppunt dat moet worden opgenomen in de index | Reden voor het indexeren van dit knooppunt |
---|---|
/a/b/c/d/e/h | Het bestaan van knooppunten h wordt geëvalueerd in de methode exist() . |
Voorbeeld 2
Hier volgt een complexere variatie van de vorige XQuery, waarbij een predicaat is toegepast:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;
In de volgende tabel ziet u de knooppunten die moeten worden geïndexeerd om deze query de selectieve XML-index te laten gebruiken.
Knooppunt dat moet worden opgenomen in de index | Reden voor het indexeren van dit knooppunt |
---|---|
/a/b/c/d/e | Een predicaat wordt toegepast op knooppunt e . |
/a/b/c/d/e/f | De waarde van het knooppunt f wordt geëvalueerd in het predicaat. |
Voorbeeld 3
Hier volgt een complexere query met een value()
-component:
SELECT T.record,
T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;
In de volgende tabel ziet u de knooppunten die moeten worden geïndexeerd om deze query de selectieve XML-index te laten gebruiken.
Knooppunt dat moet worden opgenomen in de index | Reden voor het indexeren van dit knooppunt |
---|---|
/a/b/c/d/e | Er wordt een predicaat toegepast op knooppunt e . |
/a/b/c/d/e/f | De waarde van het knooppunt f wordt geëvalueerd in het predicaat. |
/a/b/c/d/e/g | De waarde van het knooppunt g wordt geretourneerd door de value() methode. |
Voorbeeld 4
Hier volgt een query die gebruikmaakt van een FLWOR-component in een exist()
-component. (De naam FLWOR is afkomstig van de vijf componenten waaruit een XQuery FLWOR-expressie kan bestaan: for, let, where, order by en 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;
In de volgende tabel ziet u de knooppunten die moeten worden geïndexeerd om deze query de selectieve XML-index te laten gebruiken.
Knooppunt dat moet worden opgenomen in de index | Reden voor het indexeren van dit knooppunt |
---|---|
/a/b/c/d/e | Het bestaan van knooppunt e wordt geëvalueerd in de FLWOR-clausule. |
/a/b/c/d/e/f | De waarde van het knooppunt f wordt geëvalueerd in de FLWOR-clausule. |
/a/b/c/d/e/g | Het bestaan van knooppunten g wordt geëvalueerd door de exist() methode. |
Optimalisatiehints opgeven
U kunt optionele optimalisatiehints gebruiken om aanvullende toewijzingsgegevens op te geven voor een knooppunt dat wordt geïndexeerd door een selectieve XML-index. U kunt bijvoorbeeld het gegevenstype en de kardinaliteit van het knooppunt en bepaalde informatie over de structuur van de gegevens opgeven. Deze aanvullende informatie biedt ondersteuning voor beter in kaart brengen. Het resulteert ook in verbeteringen in prestaties of besparingen in opslag, of beide.
Het gebruik van optimalisatiehints is optioneel. U kunt altijd de standaardtoewijzingen accepteren, die betrouwbaar zijn, maar mogelijk niet optimale prestaties en opslag bieden.
Sommige optimalisatiehints, zoals de SINGLETON-hint, introduceren beperkingen voor uw gegevens. In sommige gevallen kunnen er fouten optreden wanneer niet aan deze beperkingen wordt voldaan.
Voordelen van optimalisatiehints
In de volgende tabel worden de optimalisatiehints geïdentificeerd die efficiëntere opslag of verbeterde prestaties ondersteunen.
Optimalisatiehint | Efficiëntere opslag | Verbeterde prestaties |
---|---|---|
node() | Ja | Nee |
SINGLETON | Nee | Ja |
GEGEVENSTYPE | Ja | Ja |
MAXLENGTH | Ja | Ja |
Optimalisatiehints en gegevenstypen
U kunt knooppunten indexeren als XQuery-gegevenstypen of als SQL Server-gegevenstypen. In de volgende tabel ziet u welke optimalisatiehints worden ondersteund voor elk gegevenstype.
Optimalisatiehint | XQuery-gegevenstypen | SQL-gegevenstypen |
---|---|---|
node() | Ja | Nee |
SINGLETON | Ja | Ja |
GEGEVENSTYPE | Ja | Nee |
MAXLENGTH | Ja | Nee |
optimalisatiehint voor knooppunt()
van toepassing op: XQuery-gegevenstypen
U kunt de node()
-optimalisatie gebruiken om een knooppunt op te geven waarvan de waarde niet vereist is om de typische query te evalueren. Deze hint vermindert de opslagvereisten wanneer de typische query alleen het bestaan van het knooppunt hoeft te evalueren. (Standaard slaat een selectieve XML-index de waarde op voor alle gepromoveerde knooppunten, met uitzondering van complexe knooppunttypen.)
Bekijk het volgende voorbeeld:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;
Als u een selectieve XML-index wilt gebruiken om deze query te evalueren, promoot u knooppunten b
en c
. Omdat de waarde van het knooppunt b
niet vereist is, kunt u echter de node()
hint met de volgende syntaxis gebruiken:
`/a/b/ as node()
Als voor een query de waarde is vereist van een knooppunt dat is geïndexeerd met de node()
hint, kan de selectieve XML-index niet worden gebruikt.
HINT VOOR SINGLETON-optimalisatie
Van toepassing op: XQuery- of SQL Server-gegevenstypen
De hint voor SINGLETON-optimalisatie geeft de kardinaliteit van een knooppunt aan. Deze hint verbetert de queryprestaties, omdat het van tevoren bekend is dat een knooppunt maximaal één keer voorkomt binnen zijn ouder of voorouder.
Bekijk het XML-voorbeelddocument in dit artikel.
Als u een selectieve XML-index wilt gebruiken om een query uit te voeren op dit document, kunt u de SINGLETON-hint voor knooppunt d
opgeven, aangezien dit maximaal één keer binnen het bovenliggende item voorkomt.
Als de SINGLETON-hint is opgegeven, maar een knooppunt meer dan één keer binnen het bovenliggende of voorouderlijke element voorkomt, wordt er een fout gegenereerd wanneer u de index maakt (voor bestaande gegevens) of wanneer u een query uitvoert (voor nieuwe gegevens).
Optimalisatiehint voor gegevenstype
van toepassing op: XQuery-gegevenstypen
Met de optimalisatiehint VOOR GEGEVENSTYPE kunt u een XQuery- of EEN SQL Server-gegevenstype opgeven voor het geïndexeerde knooppunt. Het gegevenstype wordt gebruikt voor de kolom in de gegevenstabel van de selectieve XML-index die overeenkomt met het geïndexeerde knooppunt.
Bij het casten van een bestaande waarde naar het opgegeven gegevenstype mislukt de invoegbewerking (in de index) niet; Er wordt echter een null-waarde ingevoegd in de gegevenstabel van de index.
Hint voor MAXLENGTH-optimalisatie
van toepassing op: XQuery-gegevenstypen
Met de optimalisatiehint MAXLENGTH kunt u de lengte van xs:string-gegevens beperken. MAXLENGTH is niet relevant voor SQL Server-gegevenstypen, omdat u de lengte opgeeft wanneer u de datumtypen VARCHAR of NVARCHAR opgeeft.
Wanneer een bestaande tekenreeks langer is dan de opgegeven MAXLENGTH, mislukt het invoegen van die waarde in de index.
Voorbeeld-XML-document voor voorbeelden
In de voorbeelden in dit artikel wordt verwezen naar het volgende XML-voorbeelddocument:
<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>
Zie ook
- SXI- (Selectieve XML-indexen)
- selectief XML-indexen maken, wijzigen en verwijderen