Sdílet prostřednictvím


Vytvoření indexů XML

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Tento článek popisuje, jak vytvořit primární a sekundární indexy XML.

Vytvoření primárního indexu XML

Pokud chcete vytvořit primární index XML, použijte příkaz CREATE INDEX (Transact-SQL)Transact-SQL DDL. U indexů XML nejsou podporovány všechny možnosti dostupné pro ne-XML indexy.

Při vytváření indexu XML si všimněte následujících věcí:

  • Pokud chcete vytvořit primární index XML, musí mít tabulka, která obsahuje indexovaný sloupec XML označovaný jako základní tabulka, clusterovaný index primárního klíče. Tento clusterovaný index zajišťuje, že pokud je základní tabulka rozdělená na oddíly, primární index XML je možné rozdělit pomocí stejného schématu dělení a funkce dělení.

  • Pokud existuje index XML, nelze upravit clusterovaný primární klíč tabulky. Před úpravou primárního klíče budete muset odstranit všechny indexy XML v tabulce.

  • Primární index XML lze vytvořit v jednom sloupci typu XML . Nemůžete vytvořit žádný jiný typ indexu se sloupcem typu XML jako klíčovým sloupcem. Sloupec typu XML však můžete zahrnout do indexu bez XML. Každý sloupec typu XML v tabulce může mít svůj vlastní primární index XML. Je však povolen pouze jeden primární index XML na sloupec typu XML .

  • Indexy XML existují ve stejném oboru názvů jako indexy mimo XML. Proto nemůžete mít index XML a index bez XML ve stejné tabulce se stejným názvem.

  • IGNORE_DUP_KEY a MOŽNOSTI ONLINE jsou pro indexy XML vždy vypnuté. Tyto možnosti můžete zadat pomocí hodnoty VYPNUTO.

  • Informace o skupině souborů nebo dělení tabulky uživatelů se použijí na index XML a nelze je zadat samostatně.

  • Možnost indexu DROP_EXISTING může vyhodit primární index XML a vytvořit nový primární index XML, nebo odstranit sekundární index XML a vytvořit nový sekundární index XML. Tato možnost však nemůže odstranit sekundární index XML pro vytvoření nového primárního indexu XML nebo naopak.

  • Primární názvy indexů XML mají stejná omezení jako názvy zobrazení.

    Index XML nelze vytvořit ve sloupci typu XML v zobrazení, v proměnné s hodnotou tabulky se sloupci typu XML nebo proměnnými typu XML .

  • Chcete-li změnit sloupec typu XML z nezatypovaného na typ XML nebo naopak pomocí možnosti ALTER TABLE ALTER COLUMN, neměl by ve sloupci existovat žádný index XML. Pokud existuje, je nutné ji před pokusem o změnu typu sloupce vynechat.

  • Možnost ARITHABORT musí být při vytvoření indexu XML nastavena na ZAPNUTO. Pokud chcete dotazovat, vkládat, odstraňovat nebo aktualizovat hodnoty ve sloupci XML pomocí metod datového typu XML , musí být pro připojení nastavena stejná možnost. Pokud tomu tak není, metody datového typu XML selžou.

    Poznámka:

    Informace o indexu XML najdete v zobrazeních katalogu. Sp_helpindex se ale nepodporuje. Příklady uvedené dále v tomto tématu ukazují, jak dotazovat zobrazení katalogu a najít informace o indexu XML.

Při vytváření nebo opětovném vytvoření primárního indexu XML ve sloupci datového typu XML , který obsahuje hodnoty typů xs:date schématu XML nebo xs:dateTime (nebo jakékoli podtypy těchto typů), které mají rok menší než 1, vytvoření indexu selže v SQL Serveru 2008 (10.0.x) a novějších verzích. SQL Server 2005 (9.x) tyto hodnoty povolil, takže k tomuto problému může dojít při vytváření indexů v databázi vygenerované v SYSTÉMU SQL Server 2005 (9.x). Další informace naleznete v tématu Porovnání typed XML s Untyped XML.

Příklad: Vytvoření primárního indexu XML

Ve většině příkladů se používá tabulka T (pk INT PRIMARY KEY, xCol XML) s nezatypovaným sloupcem XML. Tento příklad lze rozšířit na typ XML jednoduchým způsobem. Pro zjednodušení jsou dotazy popsány pro instance dat XML, jak je znázorněno v následující ukázce:

<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2">
   <title>Writing Secure Code</title>
   <author>
      <first-name>Michael</first-name>
      <last-name>Howard</last-name>
   </author>
   <author>
      <first-name>David</first-name>
      <last-name>LeBlanc</last-name>
   </author>
   <price>39.99</price>
</book>

Následující příkaz vytvoří index XML, který se nazývá idx_xCol, ve sloupci xCol XML tabulky T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Vytvoření sekundárního indexu XML

Pomocí příkazu CREATE INDEX (Transact-SQL)Transact-SQL DDL vytvořte sekundární indexy XML a zadejte požadovaný typ sekundárního indexu XML.

Při vytváření sekundárních indexů XML si všimněte následujících věcí:

  • Všechny možnosti indexování, které platí pro neclusterovaný index s výjimkou IGNORE_DUP_KEY a ONLINE, jsou povoleny u sekundárních indexů XML. Pro sekundární indexy XML musí být vždy nastaveny dvě možnosti vypnuté.

  • Sekundární indexy jsou rozdělené stejně jako primární index XML.

  • DROP_EXISTING může v tabulce uživatele vynechat sekundární index a vytvořit další sekundární index v tabulce uživatele.

Dotazem na zobrazení katalogu sys.xml_indexes můžete načíst informace indexu XML. Sloupec secondary_type_desc v zobrazení katalogu sys.xml_indexes poskytuje typ sekundárního indexu:

SELECT  *
FROM    sys.xml_indexes;

Hodnoty vrácené ve sloupci secondary_type_desc mohou být NULL, PATH, VALUE nebo PROPERTY. Pro primární index XML je vrácená hodnota NULL.

Příklad: Vytvoření sekundárních indexů XML

Následující příklad znázorňuje vytvoření sekundárních indexů XML. Příklad také ukazuje informace o indexech XML, které jste vytvořili.

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML);
GO
-- Create primary index.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol
ON T(XmlCol);
GO
-- Create secondary indexes (PATH, VALUE, PROPERTY).
CREATE XML INDEX PIdx_T_XmlCol_PATH ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PATH;
GO
CREATE XML INDEX PIdx_T_XmlCol_VALUE ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR VALUE;
GO
CREATE XML INDEX PIdx_T_XmlCol_PROPERTY ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PROPERTY;
GO

Dotazem na sys.xml_indexes zobrazení katalogu můžete načíst informace o indexech XML. Sloupec secondary_type_desc poskytuje sekundární typ indexu.

SELECT  *
FROM    sys.xml_indexes;

Můžete také provést dotaz na zobrazení katalogu pro získání informací o indexu.

SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T');

Můžete přidat ukázková data a pak zkontrolovat informace o indexu XML.

INSERT INTO T VALUES (1,
'<doc id="123">
<sections>
<section num="2">
<heading>Background</heading>
</section>
<section num="3">
<heading>Sort</heading>
</section>
<section num="4">
<heading>Search</heading>
</section>
</sections>
</doc>');
GO
-- Check XML index information.
SELECT *
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, NULL, 'DETAILED');
GO
-- Space usage of primary XML index
DECLARE @index_id int;
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i
WHERE   i.name = 'PIdx_T_XmlCol' and object_name(i.object_id) = 'T';

SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO
--- Space usage of secondary XML index (for example PATH secondary index)  PIdx_T_XmlCol_PATH
DECLARE @index_id int;
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i
WHERE  i.name = 'PIdx_T_XmlCol_PATH' and object_name(i.object_id) = 'T';

SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO

-- Space usage of all secondary XML indexes for a particular table
SELECT i.name, object_name(i.object_id), stats.*
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, DEFAULT, 'DETAILED') stats
JOIN sys.xml_indexes i ON (stats.object_id = i.object_id and stats.index_id = i.index_id)
WHERE secondary_type is not null;
-- Drop secondary indexes.
DROP INDEX PIdx_T_XmlCol_PATH ON T;
GO
DROP INDEX PIdx_T_XmlCol_VALUE ON T;
GO
DROP INDEX PIdx_T_XmlCol_PROPERTY ON T;
GO
-- Drop primary index.
DROP INDEX PIdx_T_XmlCol ON T;
-- Drop table T.
DROP TABLE T;
GO

Viz také