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
Indexy XML lze vytvořit ve sloupcích datového typu XML . Indexují všechny značky, hodnoty a cesty v instancích XML ve sloupci a napomáhají výkonu dotazů. Aplikace může těžit z indexu XML v následujících situacích:
Dotazy na sloupce XML jsou ve vaší úloze běžné. Náklady na údržbu indexu XML během úprav dat je potřeba zvážit.
Hodnoty XML jsou poměrně velké a načtené části jsou relativně malé. Sestavení indexu zabraňuje parsování celých dat za běhu a přináší výhody vyhledávání indexů pro efektivní zpracování dotazů.
Počínaje SQL Serverem 2022 (16.x) a novějšími verzemi a ve službě Azure SQL Database a Azure SQL Managed Instance můžete pomocí komprese XML zkomprimovat data XML mimo řádky pro sloupce XML i indexy. Komprese XML snižuje požadavky na kapacitu úložiště dat.
Indexy XML spadají do následujících kategorií:
- Primární index XML
- Sekundární index XML
Prvním indexem ve sloupci typu XML musí být primární index XML. Při použití primárního indexu XML jsou podporovány následující typy sekundárních indexů: PATH, VALUE a PROPERTY. V závislosti na typu dotazů můžou tyto sekundární indexy pomoct zlepšit výkon dotazů.
Poznámka:
Index XML nelze vytvořit ani upravit, pokud nejsou správně nastaveny možnosti databáze pro práci s datovým typem XML . Další informace najdete v tématu Použití Full-Text vyhledávání se sloupci XML.
Instance XML jsou uloženy ve sloupcích typu XML jako velké binární objekty (BLOBs). Tyto instance XML můžou být velké a uložená binární reprezentace instancí datového typu XML může být až 2 GB. Bez indexu se tyto binární velké objekty za běhu skartují, aby se vyhodnotil dotaz. Toto skartování může být časově náročné. Zvažte například následující dotaz:
;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;
Chcete-li vybrat instance XML, které splňují podmínku uvedenou v klauzuli WHERE
, binární velký objekt XML (BLOB) v každém řádku tabulky Production.ProductModel
se rozpadne za běhu. Pak se výraz (/PD:ProductDescription/@ProductModelID[.="19"]
) v exist()
metodě vyhodnotí. Toto dělení za běhu může být nákladné v závislosti na velikosti a počtu instancí uložených ve sloupci.
Pokud dotazování binárních velkých objektů XML (BLOBs) je v aplikačním prostředí běžné, pomůže indexovat sloupce typu XML . Při úpravách dat jsou ale spojené náklady na údržbu indexu.
Primární index XML
Primární index XML indexuje všechny značky, hodnoty a cesty v instancích XML ve sloupci XML. Pokud chcete vytvořit primární index XML, musí mít tabulka, ve které probíhá sloupec XML, clusterovaný index v primárním klíči tabulky. SQL Server používá tento primární klíč ke korelaci řádků v primárním indexu XML s řádky v tabulce, která obsahuje sloupec XML.
Primární index XML je skartovaná a trvalá reprezentace bloků XML ve sloupci datového typu XML . Pro každý binární objekt XML (BLOB) ve sloupci index vytvoří několik řádků dat. Počet řádků v indexu se přibližně rovná počtu uzlů v binárním rozsáhlém objektu XML. Když dotaz načte úplnou instanci XML, SQL Server poskytne instanci ze sloupce XML. Dotazy v instancích XML používají primární index XML a mohou vracet skalární hodnoty nebo podstromy XML pomocí samotného indexu.
Každý řádek obsahuje následující informace o uzlu:
Název značky, například element nebo název atributu.
Hodnota uzlu
Typ uzlu, jako je uzel elementu, uzel atributu nebo textový uzel.
Informace o objednávce dokumentu reprezentované interním identifikátorem uzlu
Cesta z každého uzlu ke kořeni stromu XML. Tento sloupec hledá výrazy cesty v dotazu.
Primární klíč základní tabulky Primární klíč základní tabulky je duplikován v primárním indexu XML pro zpětné spojení se základní tabulkou a maximální počet sloupců v primárním klíči základní tabulky je omezen na 15.
Tyto informace o uzlu slouží k vyhodnocení a vytvoření výsledků XML pro zadaný dotaz. Pro účely optimalizace se název značky a informace o typu uzlu zakódují jako celočíselné hodnoty a sloupec Cesta používá stejné kódování. Také jsou cesty uloženy v opačném pořadí, aby umožnily shodu cest, když je známa pouze přípona cesty. Například:
-
//ContactRecord/PhoneNumber
kde jsou známy pouze poslední dva kroky
NEBO
-
/Book/*/Title
kde se zástupný znak*
zadává uprostřed výrazu.
Procesor dotazů používá primární index XML pro dotazy, které zahrnují metody datových typů XML a vrací skalární hodnoty nebo podstromy XML ze samotného primárního indexu. (Tento index ukládá všechny potřebné informace k rekonstrukci instance XML.)
Následující dotaz například vrátí souhrnné informace uložené ve CatalogDescription
sloupci typu XML v ProductModel
tabulce. Dotaz vrátí <Summary>
informace pouze pro modely produktů, jejichž popis katalogu také obsahuje <Features>
popis.
;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
Pokud jde o primární index XML, namísto rozkládání každé instance binárního velkého objektu XML v základní tabulce se řádky v indexu, které odpovídají každému binárnímu velkému objektu XML, postupně prohledávají pro výraz zadaný v exist()
metodě. Pokud se cesta nachází ve sloupci Path v indexu, <Summary>
element spolu s jeho podstromy je načten z primárního indexu XML a převeden na binární binární objekt XML jako výsledek query()
metody.
Primární index XML se nepoužívá při načítání úplné instance XML. Například následující dotaz načte z tabulky celou instanci XML, která popisuje pokyny pro výrobu konkrétního modelu produktu.
USE AdventureWorks2022;
SELECT Instructions
FROM Production.ProductModel
WHERE ProductModelID = 7;
Sekundární indexy XML
Pokud chcete zvýšit výkon vyhledávání, můžete vytvořit sekundární indexy XML. Před vytvořením sekundárních indexů musí nejprve existovat primární index XML. Toto jsou typy:
Sekundární XML index cesta
Sekundární XML index VALUE
Sekundární XML index PROPERTY
Tady je několik pokynů pro vytvoření jednoho nebo více sekundárních indexů:
Pokud vaše úloha ve sloupcích XML používá výrazy cest, sekundární index XML PATH pravděpodobně urychlí vaši úlohu. Nejběžnějším případem je použití
exist()
metody ve sloupcích XML v klauzuli WHERE jazyka Transact-SQL.Pokud vaše úloha načítá více hodnot z jednotlivých instancí XML pomocí výrazů cesty, může být užitečné seskupit cesty v rámci každé instance XML v indexu PROPERTY. Tento scénář typicky nastává v kontextu kontejneru vlastností, když jsou načteny vlastnosti objektu a je známa jeho hodnota primárního klíče.
Pokud vaše úloha zahrnuje dotazování na hodnoty v instancích XML bez znalosti názvů elementů nebo atributů, které tyto hodnoty obsahují, můžete vytvořit index VALUE. K tomu obvykle dochází u vyhledávání pomocí os podřízených, jako je například
//author[last-name="Howard"]
, kde prvky<author>
mohou nastat na libovolné úrovni hierarchie. Vyskytuje se také v dotazech se zástupnými cardy, například/book [@* = "novel"]
, kde dotaz hledá<book>
prvky, které mají určitý atribut s hodnotou"novel"
.
Sekundární XML index cesta
Pokud dotazy obecně určují výrazy cesty pro sloupce typu XML , sekundární index PATH může urychlit hledání. Jak je popsáno výše v tomto článku, primární index je užitečný, pokud máte dotazy, které určují exist()
metodu v klauzuli WHERE. Pokud přidáte sekundární index PATH, můžete také zlepšit výkon vyhledávání v takových dotazech.
Ačkoli primární index XML umožňuje vyhnout se rozebírání XML binárních velkých objektů během provádění, nemusí poskytovat nejlepší výkon pro dotazy založené na výrazech cest. Vzhledem k tomu, že všechny řádky v primárním indexu XML odpovídající binárnímu rozsáhlému objektu XML se prohledávají postupně pro velké instance XML, může být postupné hledání pomalé. V tomto případě může sekundární index založený na hodnotách cesty a hodnotách uzlů v primárním indexu výrazně urychlit vyhledávání indexu. V sekundárním indexu PATH jsou hodnoty cesty a uzlu klíčové sloupce, které umožňují efektivnější hledání při hledání cest. Optimalizátor dotazů může použít index PATH pro výrazy, jako jsou například výrazy uvedené v následujících příkladech:
-
/root/Location
která určuje pouze cestu.
NEBO
-
/root/Location/@LocationID[.="10"]
kde je zadána cesta i hodnota uzlu.
Následující dotaz ukazuje, kde je užitečný index PATH:
;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;
Výraz cesty /PD:ProductDescription/@ProductModelID
a hodnota "19"
v metodě v exist()
dotazu odpovídají klíčovým polím indexu PATH. To umožňuje přímé hledání v indexu PATH a poskytuje lepší výkon hledání než sekvenční hledání hodnot cest v primárním indexu.
Sekundární XML index VALUE
Pokud jsou dotazy založené například /Root/ProductDescription/@*[. = "Mountain Bike"]
na hodnotách nebo //ProductDescription[@Name = "Mountain Bike"]
a cesta není plně zadaná nebo obsahuje zástupný znak, můžete získat rychlejší výsledky vytvořením sekundárního indexu XML, který je založený na hodnotách uzlu v primárním indexu XML.
Klíčové sloupce indexu VALUE jsou (hodnota uzlu a cesta) primárního indexu XML. Pokud vaše úloha zahrnuje dotazování na hodnoty z instancí XML bez znalosti názvů elementů nebo atributů, které obsahují hodnoty, může být užitečný index VALUE. Následující výraz může mít například výhodu, že má index VALUE:
//author[LastName="someName"]
kde znáte hodnotu prvku<LastName>
, ale nadřazený prvek<author>
může být kdekoli./book[@* = "someValue"]
kde dotaz hledá<book>
prvek, který má určitý atribut s hodnotou"someValue"
.
Následující dotaz vrátí ContactID
z Contact
tabulky. Klauzule WHERE
určuje filtr, který hledá hodnoty ve AdditionalContactInfo
sloupci typu XML. ID kontaktů jsou vrácena pouze v případě, že odpovídající další kontaktní informace XML binární velký objekt obsahuje konkrétní telefonní číslo. Vzhledem k tomu, že telephoneNumber
se prvek může objevit kdekoli v XML, výraz cesty určuje sestupnou osu nebo osu sebe sama.
;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;
V této situaci je známá vyhledávací hodnota <number>
, ale může se objevit kdekoli v instanci XML jako podřízený prvek telephoneNumber
. Tento druh dotazu může těžit z vyhledávání indexu na základě konkrétní hodnoty.
Sekundární index PROPERTY
Dotazy, které načítají jednu nebo více hodnot z jednotlivých instancí XML, můžou těžit z indexu PROPERTY. K tomuto scénáři dochází při načtení vlastností objektu pomocí value()
metody typu XML a když je známa hodnota primárního klíče objektu.
Index PROPERTY je postaven na sloupcích (PK, cesta a hodnota uzlu) primárního indexu XML, kde PK je primárním klíčem základní tabulky.
Například pro produktový model 19
následující dotaz načte hodnoty atributů ProductModelID
a ProductModelName
pomocí metody value()
. Místo použití primárního indexu XML nebo jiných sekundárních indexů XML může index PROPERTY zajistit rychlejší provádění.
;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;
S výjimkou rozdílů popsaných dále v tomto článku je vytvoření indexu XML ve sloupci typu XML podobné vytvoření indexu ve sloupci jiného typu než XML . K vytváření a správě indexů XML je možné použít následující příkazy DDL Transact-SQL:
Komprese XML
platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database a Azure SQL Managed Instance.
Povolení komprese XML změní formát fyzického úložiště dat přidružených k datovému typu XML na komprimovaný binární formát, ale nemění syntaxi nebo sémantiku dat XML. Změny aplikace nejsou vyžadovány, pokud je povolena jedna nebo více tabulek pro kompresi XML.
Komprese XML ovlivňuje pouze datový typ XML. Data XML se komprimují pomocí algoritmu komprese Xpress. Všechny existující indexy XML se komprimují pomocí komprese dat. Komprese dat je povolena interně pro indexy XML, pokud je povolena komprese XML.
Kompresi XML je možné povolit souběžně s kompresí dat ve stejných tabulkách.
Indexy XML nedědí vlastnost komprese tabulky. Chcete-li komprimovat indexy, musíte explicitně povolit kompresi XML u indexů XML.
Sekundární indexy XML nedědí vlastnost komprese primárního indexu XML.
Ve výchozím nastavení je nastavení komprese XML pro indexy XML při vytváření indexu vypnuto.
Získání informací o indexech XML
Položky indexu XML se zobrazí v zobrazení katalogu sys.indexes
s indexem type
3
. Sloupec název obsahuje název indexu XML.
Indexy XML se zaznamenávají také v zobrazení sys.xml_indexes
katalogu . Obsahuje všechny sloupce z sys.indexes
a některé konkrétní, které jsou užitečné pro indexy XML. Hodnota NULL
ve sloupci secondary_type
označuje primární index XML; hodnoty P
R
a V
stojí pro indexy PATH, PROPERTY a VALUE sekundární indexy XML.
Prostorové využití indexů XML najdete v tabulkové funkci sys.dm_db_index_physical_stats. Poskytuje informace, například počet datových stránek obsazených, průměrnou velikost řádků v bajtech a počet záznamů pro všechny typy indexů. To zahrnuje také indexy XML. Tyto informace jsou k dispozici pro každý oddíl databáze. Indexy XML používají stejné schéma dělení a funkci dělení základní tabulky.