Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Ez a cikk azt ismerteti, hogyan adhatja meg a csomópontok indexelési útvonalait, és optimalizálási tippeket az indexeléshez szelektív XML-indexek létrehozásakor vagy módosításakor.
A csomópontok elérési útvonalait és optimalizálási tippeit egyszerre kell megadnia az alábbi utasítások egyikében:
A egy CREATE utasítás FOR záradékában található. További információ: SZELEKTÍV XML-INDEX LÉTREHOZÁSA (Transact-SQL).
Az ADD záradékában egy ALTER utasításnak. További információ: ALTER INDEX (Szelektív XML-indexek).
További információ a szelektív XML-indexekről: Szelektív XML-indexek (SXI).
XQuery- és SQL Server-típusok ismertetése nem beírt XML-fájlban
A szelektív XML-indexek két típusrendszert támogatnak: XQuery- és SQL Server-típusokat. Az indexelt elérési út egy XQuery-kifejezéshez, vagy az value() adattípus metódusának visszatérési típusához használható.
Ha az index elérési útja nincs széljegyzetekkel elfűzve, vagy az XQUERY kulcsszóval van eljegyzve, az elérési út megfelel egy XQuery-kifejezésnek. Az XQUERY-jegyzetekkel ellátott csomópontok elérési útjainak két változata létezik:
Ha nem adja meg az XQUERY kulcsszót és az XQuery-adattípust, akkor a rendszer az alapértelmezett leképezéseket használja. A teljesítmény és a tárolás általában nem optimális.
Ha megadja az XQUERY kulcsszót és az XQuery adattípust, és opcionálisan más optimalizálási tippeket, akkor a lehető legjobb teljesítményt és a lehető leghatékonyabb tárolást érheti el. A leadott adatok azonban sikertelenek lehetnek.
Ha egy index elérési útját az SQL-kulcsszóval jegyzeteli, az elérési út megegyezik az
value()adattípus metódusának visszatérési típusával. Adja meg a megfelelő SQL Server-adattípust, amely avalue()metódustól elvárt visszatérési típus.
Az XQuery-kifejezések XML-típusrendszere és a value() adattípus metódusára alkalmazott SQL Server-típusrendszer között apró különbségek vannak. Ezek a különbségek a következők:
Az XQuery típusú rendszer ismeri a záró szóközöket. Az XQuery-típus szemantikája szerint például az "abc" és az "abc" sztringek nem egyenlők, míg az SQL Serverben ezek a sztringek egyenlők.
Az XQuery lebegőpontos adattípusok a +/- nulla és a +/- végtelen speciális értékeket támogatják. Ezek a speciális értékek nem támogatottak az SQL Server lebegőpontos adattípusaiban.
XQuery-típusok nem beírt XML-fájlban
Az XQuery-típusok az xml adattípus minden metódusában megegyeznek az XQuery-kifejezésekkel, beleértve a
value()metódust is.Az XQuery-típusok támogatják ezeket az optimalizálási tippeket: node(), SINGLETON, DATA TYPE és MAXLENGTH.
A nem beírt XML-eken keresztüli XQuery-kifejezések esetében két működési mód közül választhat:
Alapértelmezett leképezési mód. Ebben a módban csak az elérési utat adja meg szelektív XML-index létrehozásakor.
felhasználó által megadott leképezési módot. Ebben a módban az elérési utat és az opcionális optimalizálási tippeket is meg kell adnia.
Az alapértelmezett leképezési mód egy konzervatív tárolási lehetőséget használ, amely mindig biztonságos és általános. Bármilyen kifejezéstípusnak megfelelhet. Az alapértelmezett leképezési mód korlátozása kisebb, mint az optimális teljesítmény, mivel nagyobb számú futtatókörnyezeti leadásra van szükség, és a másodlagos indexek nem érhetők el.
Íme egy példa az alapértelmezett leképezésekkel létrehozott szelektív XML-indexre. Mindhárom útvonal esetében az alapértelmezett csomóponttípus (xs:untypedAtomic) és a számosság használatos.
CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
mypath01 = '/a/b',
mypath02 = '/a/b/c',
mypath03 = '/a/b/d'
);
A felhasználó által megadott leképezési mód lehetővé teszi a csomópont típusának és számosságának megadását a jobb teljesítmény érdekében. Ezt a jobb teljesítményt azonban úgy érheti el, hogy feladja a biztonságot – mert a leadás meghiúsulhat – és általános, mert csak a megadott típus felel meg a szelektív XML-indexnek.
A nem beírt XML-esetekhez támogatott XQuery-típusok a következők:
xs:booleanxs:doublexs:stringxs:datexs:timexs:dateTime
Ha a típus nincs megadva, a csomópontot a rendszer xs:untypedAtomic adattípusnak tekinti.
Az alábbi módon optimalizálhatja a szelektív XML-indexet:
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-típusok típus nélküli XML-ben
Az SQL Server-típusok megfelelnek a
value()metódus visszatérési értékének.Az SQL Server-típusok támogatják ezt az optimalizálási tippet: SINGLETON.
Az SQL Server-típusok visszaadására szolgáló útvonalak esetében kötelező megadni egy típust. Használja ugyanazt az SQL Server-típust, amelyet a value() metódusban használna.
Fontolja meg a következő lekérdezést:
SELECT T.record,
T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;
A megadott lekérdezés egy értéket ad vissza a NVARCHAR(200) adattípusba csomagolt elérési útból /a/b/d, így a csomóponthoz megadható adattípus nyilvánvaló. Azonban nincs olyan séma, amely megadhatja a csomópont számosságát a típus nélküli XML-ben. Ha meg szeretné adni, hogy a csomópont d legfeljebb egyszer jelenjen meg a szülőcsomópont balatt, hozzon létre egy szelektív XML-indexet, amely a SINGLETON optimalizálási tippet használja az alábbiak szerint:
CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);
A gépelt XML szelektív XML-index támogatásának ismertetése
Az SQL Serverbe beírt XML egy adott XML-dokumentumhoz társított séma. A séma általános dokumentumstruktúrát és csomóponttípusokat határoz meg. Ha létezik séma, a szelektív XML-index akkor alkalmazza a sémastruktúrát, amikor a felhasználó előlépteti az elérési utakat, így nem kell megadni az elérési utak XQUERY-típusait.
A szelektív XML-index a következő XSD-típusokat támogatja:
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
Ha szelektív XML-indexet hoz létre egy olyan dokumentumon, amelyhez séma van társítva, az XQuery-típus megadása az index létrehozásakor vagy módosításakor hibát ad vissza. A felhasználó sql típusú széljegyzeteket használhat az útvonal-előléptetési részben. Az SQL-típusnak érvényes átalakításnak kell lennie a sémában definiált XSD-típusból, vagy hibaüzenet jelenik meg. Az XSD-ben megfelelő reprezentációval rendelkező SQL-típusok támogatottak, kivéve a dátum- és időtípusokat.
Jegyzet
A szelektív index akkor használatos, ha a szelektív XML-index elérési útjának előléptetésében megadott típus megegyezik a value() metódus visszatérési értékével.
A gépelt XML-dokumentumokhoz az alábbi optimalizálási tippek használhatók:
node()optimalizálási útmutatás.A MAXLENGTH optimalizálási tipp xs:sztringtípusokkal használható az indexelt érték lerövidítéséhez.
További információ az optimalizálási tippekről: Optimalizálási tippek megadása.
Elérési utak megadása
A szelektív XML-index lehetővé teszi, hogy a tárolt XML-adatokból csak a csomópontok egy részhalmazát indexelje, amelyek relevánsak a várhatóan futtatandó lekérdezésekhez. Ha a releváns csomópontok részhalmaza sokkal kisebb, mint az XML-dokumentumban található csomópontok teljes száma, a szelektív XML-index csak az érintett csomópontokat tárolja. A szelektív XML-index előnyeinek kihasználásához azonosítsa a csomópontok indexeléshez megfelelő részhalmazát.
Az indexelendő csomópontok kiválasztása
Az alábbi két alapelv segítségével azonosíthatja a csomópontok megfelelő részhalmazát, amelyet egy szelektív XML-indexhez szeretne hozzáadni.
1. alapelv: Egy adott XQuery-kifejezés kiértékeléséhez indexelje az összes megvizsgálandó csomópontot.
Indexelje az összes csomópontot, amelynek létezését vagy értékét az XQuery-kifejezés használja.
Indexelje az összes csomópontot az XQuery kifejezésben, amelyre az XQuery-predikátumok vonatkoznak.
Tekintse meg a következő lekérdezést a jelen cikkben szereplő XML-mintadokumentum:
SELECT T.record FROM myXMLTable T WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;A lekérdezésnek megfelelő XML-példányok visszaadásához egy szelektív XML-indexnek minden XML-példányban két csomópontot kell megvizsgálnia:
Csomópont
c, mivel az értékét az XQuery kifejezés használja.Csomópont
b, mert az XQuery-kifejezésben egy predikátum van alkalmazva a csomópontonb.
2. alapelv: A legjobb teljesítmény érdekében indexelje az összes csomópontot, amelyek egy adott XQuery-kifejezés kiértékeléséhez szükségesek. Ha csak néhány csomópontot indexel, akkor a szelektív XML-index javítja a csak indexelt csomópontokat tartalmazó alexpressziók kiértékelését.
A fenti SELECT utasítás teljesítményének javítása érdekében a következő szelektív XML-indexet hozhatja létre:
CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
path123 = '/a/b',
path124 = '/a/b/c'
);
Azonos elérési utak indexelése
Nem lehet azonos elérési utakat azonos adattípusként előléptetni különböző elérési utak neve alatt. A következő lekérdezés például hibát jelez, mert pathOne és pathTwo azonosak:
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'
);
Az azonos elérési utakat azonban megadhatja eltérő nevű különböző adattípusként. A következő lekérdezés például elfogadható, mert az adattípusok eltérőek:
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éldák
Íme néhány további példa a különböző XQuery-típusok indexeléséhez szükséges csomópontok kiválasztására.
1. példa
Íme egy egyszerű XQuery, amely a exist() metódust használja:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;
Az alábbi táblázat azokat a csomópontokat mutatja be, amelyeket indexelni kell ahhoz, hogy a lekérdezés szelektív XML-indexet használjon.
| Az indexbe felvenni kívánt csomópont | A csomópont indexelésének oka |
|---|---|
| /a/b/c/d/e/h | A csomóponti h meglétét a exist() metódus értékeli ki. |
2. példa
Az előző XQuery összetettebb változata egy predikátummal:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;
Az alábbi táblázat azokat a csomópontokat mutatja be, amelyeket indexelni kell ahhoz, hogy a lekérdezés szelektív XML-indexet használjon.
| Az indexbe felvenni kívánt csomópont | A csomópont indexelésének oka |
|---|---|
| /a/b/c/d/e | Egy predikátum kerül alkalmazásra a csomópont e-ra. |
| /a/b/c/d/e/f | A csomópont f értéke a predikátumon belül lesz kiértékelve. |
3. példa
Íme egy összetettebb lekérdezés egy value() záradékkal:
SELECT T.record,
T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;
Az alábbi táblázat azokat a csomópontokat mutatja be, amelyeket indexelni kell ahhoz, hogy a lekérdezés szelektív XML-indexet használjon.
| Az indexbe felvenni kívánt csomópont | A csomópont indexelésének oka |
|---|---|
| /a/b/c/d/e | Egy predikátum kerül alkalmazásra a csomópont e-ra. |
| /a/b/c/d/e/f | A csomópont f értéke a predikátumon belül lesz kiértékelve. |
| /a/b/c/d/e/g | A csomópont g értékét a value() metódus adja vissza. |
4. példa
Íme egy lekérdezés, amely egy FLWOR záradékot használ egy exist() záradékon belül. (Az FLWOR név abból az öt záradékból származik, amelyek XQuery FLWOR-kifejezést alkothatnak: for, let, where, order by és 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;
Az alábbi táblázat azokat a csomópontokat mutatja be, amelyeket indexelni kell ahhoz, hogy a lekérdezés szelektív XML-indexet használjon.
| Az indexbe felvenni kívánt csomópont | A csomópont indexelésének oka |
|---|---|
| /a/b/c/d/e | A csomóponti e meglétét az FLWOR záradék értékeli ki. |
| /a/b/c/d/e/f | A csomópont f értékét az FLWOR záradék értékeli ki. |
| /a/b/c/d/e/g | A csomóponti g meglétét a exist() metódus értékeli ki. |
Optimalizálási tippek megadása
Az opcionális optimalizálási tippek segítségével további leképezési adatokat adhat meg egy szelektív XML-index által indexelt csomóponthoz. Megadhatja például a csomópont adattípusát és számosságát, valamint az adatok szerkezetével kapcsolatos bizonyos információkat. Ez a további információ támogatja a jobb leképezést. Emellett a teljesítmény és a tárolási megtakarítások javulását is eredményezi, vagy mindkettőt.
Az optimalizálási tippek használata nem kötelező. Mindig elfogadhatja az alapértelmezett leképezéseket, amelyek megbízhatóak, de nem biztosítják az optimális teljesítményt és tárolást.
Egyes optimalizálási tippek, például a SINGLETON-tipp, korlátozásokat vezetnek be az adatokra. Bizonyos esetekben hibák léphetnek fel, ha ezek a korlátozások nem teljesülnek.
Az optimalizálási tippek előnyei
Az alábbi táblázat azokat az optimalizálási tippeket azonosítja, amelyek támogatják a hatékonyabb tárolást vagy a jobb teljesítményt.
| Optimalizálási tipp | Hatékonyabb tárolás | Jobb teljesítmény |
|---|---|---|
| csomópont() | Igen | Nem |
| SINGLETON | Nem | Igen |
| ADATTÍPUS | Igen | Igen |
| MAXLENGTH | Igen | Igen |
Optimalizálási tippek és adattípusok
A csomópontokat XQuery-adattípusként vagy SQL Server-adattípusként is indexelheti. Az alábbi táblázat bemutatja, hogy mely optimalizálási tippek támogatottak az egyes adattípusok esetében.
| Optimalizálási tipp | XQuery-adattípusok | SQL-adattípusok |
|---|---|---|
| csomópont() | Igen | Nem |
| SINGLETON | Igen | Igen |
| ADATTÍPUS | Igen | Nem |
| MAXLENGTH | Igen | Nem |
node() optimalizálási tipp
A következőkre vonatkozik: XQuery-adattípusok
A node() optimalizálás használatával megadhatja azt a csomópontot, amelynek értéke nem szükséges a tipikus lekérdezés kiértékeléséhez. Ez a tipp csökkenti a tárolási követelményeket, ha a tipikus lekérdezésnek csak a csomópont meglétét kell kiértékelnie. (Alapértelmezés szerint egy szelektív XML-index tárolja az összes előléptetett csomópont értékét, kivéve az összetett csomóponttípusokat.)
Vegye figyelembe a következő példát:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;
Ha szelektív XML-indexet szeretne használni a lekérdezés kiértékeléséhez, előléptesse a csomópontokat b és c. Mivel azonban a csomópont b értéke nem kötelező, a node() tippet a következő szintaxissal használhatja:
`/a/b/ as node()
Ha egy lekérdezéshez a node() tipptel indexelt csomópont értéke szükséges, akkor a szelektív XML-index nem használható.
SINGLETON optimalizálási tipp
A következőkre vonatkozik: XQuery- vagy SQL Server-adattípusok
A SINGLETON optimalizálási tipp egy csomópont számosságát határozza meg. Ez a tipp javítja a lekérdezési teljesítményt, mivel előre ismert, hogy egy csomópont legfeljebb egy alkalommal jelenik meg a szülőben vagy az ősben.
Tekintse át a jelen cikkben szereplő XML-mintadokumentum.
Ha szelektív XML-indexet szeretne használni a dokumentum lekérdezéséhez, megadhatja a SINGLETON hint utasítást a d csomópontra, mivel az legfeljebb egyszer jelenik meg a szülő elemében.
Ha a SINGLETON-tipp meg van adva, de egy csomópont többször jelenik meg a szülőben vagy az ősében, akkor az index létrehozásakor (meglévő adatok esetében) vagy lekérdezés futtatásakor (új adatok esetén) hiba jelenik meg.
ADATTÍPUS-optimalizálási tipp
A következőkre vonatkozik: XQuery-adattípusok
Az ADATTÍPUS-optimalizálási tipp lehetővé teszi az indexelt csomópont XQuery- vagy SQL Server-adattípusának megadását. Az adattípus az indexelt csomópontnak megfelelő szelektív XML-index adattáblájának oszlopához használatos.
Ha egy meglévő értéket nem sikerül a megadott adattípusra átkonvertálni, a beszúrási művelet (az indexbe) nem bukik el; azonban az index adattáblájába null érték kerül be.
MAXLENGTH optimalizálási tipp
A következőkre vonatkozik: XQuery-adattípusok
A MAXLENGTH optimalizálási tipp lehetővé teszi az xs:sztringadatok hosszának korlátozását. A MAXLENGTH nem releváns az SQL Server-adattípusok esetében, mivel a VARCHAR vagy az NVARCHAR dátumtípusok megadásakor megadja a hosszt.
Ha egy meglévő sztring hosszabb, mint a megadott MAXLENGTH, akkor az érték indexbe való beszúrása meghiúsul.
Példa xml-dokumentumra
A cikk példái a következő XML-mintadokumentumra hivatkoznak:
<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>