Megosztás a következőn keresztül:


XML-indexek (SQL Server)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

XML-indexek xml adattípusú oszlopokon hozhatók létre. Indexelik az összes címkét, értéket és elérési utat az oszlop XML-példányai között, és kihasználják a lekérdezési teljesítményt. Az alkalmazás az alábbi esetekben használhatja az XML-indexet:

  • Az XML-oszlopok lekérdezései gyakran előfordulnak a számítási feladatban. Figyelembe kell venni az XML-indexek karbantartási költségeit az adatmódosítás során.

  • Az XML-értékek viszonylag nagyok, a beolvasott részek pedig viszonylag kicsik. Az index létrehozása elkerüli a teljes adatok futásidőben történő elemzését, és az indexkeresések hatékony lekérdezésfeldolgozást eredményeznek.

Az SQL Server 2022 (16.x) és újabb verzióitól kezdve az Azure SQL Database-ben, a Microsoft Fabric SQL Database-ben és a felügyelt Azure SQL-példányban XML-tömörítéssel tömörítheti a soron kívüli XML-adatokat az XML-oszlopokhoz és az indexekhez egyaránt. Az XML-tömörítés csökkenti az adattárolási kapacitásra vonatkozó követelményeket.

Az XML-indexek a következő kategóriákba sorolhatók:

  • Elsődleges XML-index
  • Másodlagos XML-index

Az xml-típus oszlopának első indexének az elsődleges XML-indexnek kell lennie. Az elsődleges XML-index használatával a másodlagos indexek alábbi típusai támogatottak: PATH, VALUE és PROPERTY. A lekérdezések típusától függően ezek a másodlagos indexek segíthetnek a lekérdezési teljesítmény javításában.

Megjegyzés:

Xml-indexet csak akkor hozhat létre vagy módosíthat, ha az adatbázis beállításai megfelelően vannak beállítva az XML-adattípus használatához. További információ: Full-Text keresés használata XML-oszlopokkal.

Az XML-példányok xml típusú oszlopokban vannak tárolva nagy bináris objektumként (BLOB-okként). Ezek az XML-példányok nagyok lehetnek, és az XML-adattípus-példányok tárolt bináris ábrázolása akár 2 GB is lehet. Index nélkül ezeket a bináris nagy objektumokat futtatáskor a rendszer a lekérdezések kiértékeléséhez aprítja. Ez az aprítás időigényes lehet. Lásd példaként az alábbi lekérdezést:

;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1;

A WHERE záradék feltételének megfelelő XML-példányok kiválasztásához az egyes táblázatsorokban lévő Production.ProductModel XML bináris nagy objektumok (BLOB) futási időben feldolgozásra kerülnek. Ezután a (/PD:ProductDescription/@ProductModelID[.="19"] metódusban történik a exist() kifejezés kiértékelése. Ez a futásidejű aprítás költséges lehet az oszlopban tárolt példányok méretétől és számától függően.

Ha az alkalmazáskörnyezetben gyakori az XML bináris nagy objektumok (BLOB-k) lekérdezése, segít indexelni az XML-típusoszlopokat . Az index az adatmódosítás során történő fenntartásával kapcsolatos költségekkel jár.

Elsődleges XML-index

Az elsődleges XML-index indexeli az XML-oszlopBAN lévő XML-példányokon belüli címkéket, értékeket és elérési utakat. Elsődleges XML-index létrehozásához az XML-oszlopot tároló táblának fürtözött indexet kell tartalmaznia a tábla elsődleges kulcsán. Az SQL Server ezzel az elsődleges kulccsal korrelálja az elsődleges XML-index sorait az XML-oszlopot tartalmazó táblában lévő sorokkal.

Az elsődleges XML-index az XML-blobok csonkított és tartós ábrázolása az xml adattípus oszlopában. Az oszlopban lévő minden nagy XML-bináris objektum (BLOB) esetében az index több adatsort hoz létre. Az index sorainak száma körülbelül megegyezik az XML bináris nagy objektum csomópontjainak számával. Amikor egy lekérdezés lekéri a teljes XML-példányt, az SQL Server az XML oszlopból biztosítja a példányt. Az XML-példányokon belüli lekérdezések az elsődleges XML-indexet használják, és az index használatával skaláris értékeket vagy XML-részösszegeket adhatnak vissza.

Minden sor a következő csomópontadatokat tárolja:

  • Címkenév, például elem vagy attribútum neve.

  • Csomópontérték.

  • Csomóponttípus, például elemcsomópont, attribútumcsomópont vagy szövegcsomópont.

  • Dokumentumrendelési információk, amelyeket egy belső csomópont-azonosító jelöl.

  • Útvonal minden csomóponttól az XML-fa gyökeréhez. Ez az oszlop elérésiút-kifejezéseket keres a lekérdezésben.

  • Az alaptábla elsődleges kulcsa. Az alaptábla elsődleges kulcsa duplikálva van az elsődleges XML-indexben az alaptáblával való visszacsatlakozáshoz, és az alaptábla elsődleges kulcsában lévő oszlopok maximális száma legfeljebb 15 lehet.

Ezek a csomópontadatok egy adott lekérdezés XML-eredményeinek kiértékelésére és létrehozására szolgálnak. Optimalizálás céljából a címke neve és a csomóponttípus adatai egész számként vannak kódolva, az Elérési út oszlop pedig ugyanazt a kódolást használja. Emellett az elérési utakat fordított sorrendben tárolja a rendszer, hogy lehetővé tegye az egyező elérési utakat, ha csak az elérésiút-utótag ismert. Például:

  • //ContactRecord/PhoneNumber ahol csak az utolsó két lépés ismert

vagy

  • /Book/*/Title ahol a helyettesítő karakter * a kifejezés közepén van megadva.

A lekérdezésfeldolgozó az elsődleges XML-indexet használja az xml-adattípus-metódusokat tartalmazó lekérdezésekhez, és skaláris értékeket vagy az elsődleges indexből származó XML-részösszegeket ad vissza. (Ez az index tárolja az XML-példány rekonstruálásához szükséges összes információt.)

Az alábbi lekérdezés például a tábla CatalogDescription oszlopában ProductModel tárolt összesítő adatokat adja vissza. A lekérdezés csak olyan termékmodellek <Summary> adatait adja vissza, amelyek katalógusleírása a leírást <Features> is tárolja.

;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('  /PD:ProductDescription/PD:Summary') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1

Ami az elsődleges XML-indexet illeti, ahelyett, hogy az alaptáblában lévő összes xml bináris nagy objektumpéldányt aprítanak, az index azon sorait, amelyek megfelelnek az egyes nagy XML-bináris objektumoknak, egymás után keresik a exist() metódusban megadott kifejezést. Ha az elérési út az index Elérési út oszlopában található, az <Summary> elem és az alösszegei lekérhetők az elsődleges XML-indexből, és a metódus eredményeként query() xml bináris nagy objektummá alakulnak.

Az elsődleges XML-index nem használható teljes XML-példány beolvasásakor. Az alábbi lekérdezés például lekéri a táblából a teljes XML-példányt, amely egy adott termékmodell gyártási utasításait írja le.

USE AdventureWorks2022;

SELECT Instructions
FROM   Production.ProductModel
WHERE  ProductModelID = 7;

Másodlagos XML-indexek

A keresési teljesítmény javítása érdekében másodlagos XML-indexeket hozhat létre. A másodlagos indexek létrehozása előtt először létre kell hoznia egy elsődleges XML-indexet. Ezek a típusok:

  • PATH másodlagos XML-index

  • ÉRTÉK másodlagos XML-index

  • Az XML másodlagos tulajdonságindexe

Az alábbiakban néhány útmutatást talál egy vagy több másodlagos index létrehozásához:

  • Ha a számítási feladat jelentősen használ elérésiút-kifejezéseket AZ XML-oszlopokon, a PATH másodlagos XML-index valószínűleg felgyorsítja a számítási feladatot. A leggyakoribb eset az XML-oszlopokon alkalmazott exist() metódus használata a Transact-SQL WHERE záradékában.

  • Ha a terhelés több értéket kér le az egyes XML-példányokból útvonal-kifejezések használatával, az XML-példányon belüli elérési utak csoportosítása a tulajdonságindexben hasznos lehet. Ez a forgatókönyv általában egy tulajdonságcsomag-forgatókönyvben fordul elő, amikor egy objektum tulajdonságait lekéri, és az elsődleges kulcs értéke ismert.

  • Ha a számítási feladat magában foglalja az XML-példányokban lévő értékek lekérdezését anélkül, hogy ismerné az értékeket tartalmazó elemet vagy attribútumneveket, érdemes lehet létrehoznia az ÉRTÉK indexet. Ez általában a leszármazott tengelyek keresésével történik, például //author[last-name="Howard"]ahol <author> az elemek a hierarchia bármely szintjén előfordulhatnak. Helyettesítő lekérdezésekben is előfordul, például /book [@* = "novel"]olyankor, amikor a lekérdezés olyan elemeket keres<book>, amelyek valamilyen attribútummal rendelkeznek."novel"

PATH másodlagos XML-index

Ha a lekérdezések általában útvonalkifejezéseket adnak meg xml típusú oszlopokban, a PATH másodlagos index felgyorsíthatja a keresést. A cikk korábbi részében leírtaknak megfelelően az elsődleges index akkor hasznos, ha a WHERE záradékban metódust meghatározó exist() lekérdezések vannak. Ha path másodlagos indexet ad hozzá, az ilyen lekérdezések keresési teljesítményét is javíthatja.

Bár az elsődleges XML-indexek futás közben elkerülik a bináris XML-objektumok aprítását, előfordulhat, hogy nem nyújt a legjobb teljesítményt az elérésiút-kifejezéseken alapuló lekérdezésekhez. Mivel az elsődleges XML-indexen belül egy XML bináris nagy objektumnak megfelelő összes sor egymás után kerül keresésre nagy XML-példányok esetén, a szekvenciális keresés lassú lehet. Ebben az esetben az elsődleges index elérésiút- és csomópontértékekre épülő másodlagos indexe jelentősen felgyorsíthatja az indexkeresést. A PATH másodlagos indexben az elérési út és a csomópont értékei olyan kulcsoszlopok, amelyek lehetővé teszik a hatékonyabb kereséseket az elérési utak keresésekor. A lekérdezésoptimalizáló a PATH indexet használhatja az alábbihoz hasonló kifejezésekhez:

  • /root/Location amely csak egy elérési utat ad meg

vagy

  • /root/Location/@LocationID[.="10"] ahol az elérési út és a csomópont értéke is meg van adva.

Az alábbi lekérdezés bemutatja, hogy hol hasznos a PATH-index:

;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1;

A lekérdezésben az elérési út kifejezése /PD:ProductDescription/@ProductModelID és a "19" metódus értéke exist() a PATH index kulcsmezőinek felel meg. Ez lehetővé teszi a közvetlen keresést a PATH-indexben, és jobb keresési teljesítményt biztosít, mint az elsődleges index elérésiút-értékeinek szekvenciális keresése.

ÉRTÉK másodlagos XML-index

Ha például a lekérdezések értékalapúak, vagy /Root/ProductDescription/@*[. = "Mountain Bike"]ha az elérési út nincs teljesen megadva, //ProductDescription[@Name = "Mountain Bike"] vagy helyettesítő karaktert tartalmaz, akkor gyorsabb eredményeket érhet el egy másodlagos XML-index létrehozásával, amely az elsődleges XML-index csomópontértékeire épül.

Az ÉRTÉK index fő oszlopai az elsődleges XML-index csomópontértéke és elérési útja. Ha a számítási feladat xml-példányokból származó értékek lekérdezését foglalja magában anélkül, hogy ismerné az értékeket tartalmazó elemet vagy attribútumneveket, hasznos lehet az ÉRTÉK index. Az alábbi kifejezés például hasznos lehet egy ÉRTÉK index használata esetén:

  • //author[LastName="someName"] ahol az elem <LastName> értékét ismeri, de a <author> szülő bárhol megjelenhet.

  • /book[@* = "someValue"] ahol a lekérdezés az <book> értéket "someValue"tartalmazó attribútummal rendelkező elemet keresi.

A következő lekérdezés a ContactID táblából ad visszaContact. A WHERE záradék egy szűrőt ad meg, amely az AdditionalContactInfoxml-típus oszlopában keres értékeket. A névjegyazonosítókat csak akkor adja vissza a rendszer, ha a megfelelő további kapcsolattartási adatok XML bináris nagyméretű objektuma tartalmaz egy adott telefonszámot. Mivel az telephoneNumber elem bárhol megjelenhet az XML-ben, az elérési út kifejezés a csökkenő vagy az öntengelyt határozza meg.

;WITH XMLNAMESPACES (
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT
)

SELECT ContactID
FROM Person.Contact
WHERE AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1;

Ebben az esetben a keresési érték <number> ismert, de bárhol megjelenhet az XML-példányban az telephoneNumber elem gyermekeként. Az ilyen típusú lekérdezések kihasználhatják egy adott értéken alapuló indexkeresés előnyeit.

TULAJDONSÁG másodlagos indexe

Az egyes XML-példányokból egy vagy több értéket lekérő lekérdezések előnyére válhatnak a TULAJDONSÁGindexek. Ez a forgatókönyv akkor fordul elő, ha az value() metódusával lekéri az objektum tulajdonságait, és ha az objektum elsődleges kulcsértéke ismert.

A PROPERTY index az elsődleges XML-index oszlopaira (PK, elérési út és csomópontérték) épül, ahol a PK az alaptábla elsődleges kulcsa.

Termékmodell 19 esetén például az alábbi lekérdezés a ProductModelID és ProductModelName attribútumértékeket a value() metódus használatával kéri le. Az elsődleges XML-index vagy a többi másodlagos XML-index használata helyett a TULAJDONSÁGindex gyorsabb végrehajtást biztosíthat.

;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")

SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS ModelID,
  CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') AS ModelName
FROM Production.ProductModel
WHERE ProductModelID = 19;

A cikk későbbi részében ismertetett különbségek kivételével az XML-index létrehozása egy xml típusú oszlopban hasonló ahhoz, mint egy nem xml típusú oszlop indexének létrehozása. Az XML-indexek létrehozásához és kezeléséhez a következő Transact-SQL DDL-utasítások használhatók:

XML-tömörítés

A következőkre vonatkozik: SQL Server 2022 (16.x) és újabb verziók, valamint az Azure SQL Database, a Microsoft Fabric SQL Database és a felügyelt Azure SQL-példány.

Az XML-tömörítés engedélyezése az XML-adattípushoz társított adatok fizikai tárolási formátumát tömörített bináris formátumra módosítja, de nem módosítja az XML-adatok szintaxisát vagy szemantikáját. Nem szükséges alkalmazásmódosítás, ha egy vagy több tábla engedélyezve van az XML-tömörítéshez.

Csak az XML-adattípust érinti az XML-tömörítés. Az XML-adatok az Xpress tömörítési algoritmussal lesznek tömörítve. A meglévő XML-indexek tömörítése adattömörítéssel történik. Ha engedélyezve van az XML-tömörítés, az adattömörítés az XML-indexek esetében belsőleg engedélyezve van.

Az XML-tömörítés engedélyezhető egymás mellett, ugyanazon táblák adattömörítésével.

Az XML-indexek nem öröklik a tábla tömörítési tulajdonságát. Az indexek tömörítéséhez explicit módon engedélyeznie kell az XML-tömörítést AZ XML-indexeken.

A másodlagos XML-indexek nem öröklik az elsődleges XML-index tömörítési tulajdonságát.

Alapértelmezés szerint az XML-indexek XML-tömörítési beállítása KI értékre van állítva az index létrehozásakor.

Információk lekérése XML-indexekről

Az XML-indexbejegyzések a katalógusnézetben sys.indexes jelennek meg a következő indexkel type3: . A névoszlop tartalmazza az XML-index nevét.

Az XML-indexeket a katalógusnézetben is rögzíti a rendszer sys.xml_indexes. Ez tartalmazza az XML-indexekhez hasznos összes oszlopot sys.indexes és néhány konkrét oszlopot. NULL Az oszlop secondary_type értéke egy elsődleges XML-indexet jelöl, az értékek PRV pedig a PATH, a PROPERTY és az VALUE másodlagos XML-indexeket jelölik.

Az XML-indexek térhasználata megtalálható a táblaértékelt függvény sys.dm_db_index_physical_statsben. Olyan információkat biztosít, mint a foglalt adatlapok száma, a bájtok átlagos sormérete és a rekordok száma az összes indextípushoz. Ide tartoznak az XML-indexek is. Ez az információ minden adatbázispartícióhoz elérhető. Az XML-indexek ugyanazt a particionálási sémát és particionálási függvényt használják az alaptábla számára.

Következő lépések