Udostępnij za pomocą


Tworzenie indeksów XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

W tym artykule opisano sposób tworzenia podstawowych i pomocniczych indeksów XML.

Tworzenie podstawowego indeksu XML

Aby utworzyć podstawowy indeks XML, użyj instrukcji CREATE INDEX (Transact-SQL)Transact-SQL DDL. Nie wszystkie opcje dostępne dla indeksów innych niż XML są obsługiwane w indeksach XML.

Podczas tworzenia indeksu XML zwróć uwagę na następujące kwestie:

  • Aby utworzyć podstawowy indeks XML, tabela zawierająca indeksowaną kolumnę XML, nazywaną tabelą bazową, musi mieć indeks klastrowany w kluczu podstawowym. Ten indeks klastrowany zapewnia, że jeśli tabela podstawowa jest partycjonowana, podstawowy indeks XML można partycjonować przy użyciu tego samego schematu partycjonowania i funkcji partycjonowania.

  • Jeśli indeks XML istnieje, klastrowany klucz podstawowy tabeli nie może być modyfikowany. Przed zmodyfikowaniem klucza podstawowego należy usunąć wszystkie indeksy XML w tabeli.

  • Podstawowy indeks XML można utworzyć w jednej kolumnie typu XML . Nie można utworzyć żadnego innego typu indeksu z kolumną typu xml jako kolumną klucza. Można jednak dołączyć kolumnę typu xml do indeksu innego niż XML. Każda kolumna typu xml w tabeli może mieć własny podstawowy indeks XML. Dozwolony jest jednak tylko jeden podstawowy indeks XML na kolumnę typu xml .

  • Indeksy XML istnieją w tej samej przestrzeni nazw co indeksy inne niż XML. W związku z tym nie można mieć indeksu XML i indeksu innego niż XML w tej samej tabeli o tej samej nazwie.

  • opcje IGNORE_DUP_KEY i ONLINE są zawsze ustawione na OFF dla indeksów XML. Możesz określić te opcje z wartością OFF.

  • Informacje o grupie plików lub partycjonowaniu tabeli użytkownika są stosowane do indeksu XML i nie można określić oddzielnie.

  • Opcja indeksu DROP_EXISTING może spowodować usunięcie podstawowego indeksu XML i utworzenie nowego podstawowego indeksu XML lub usunięcie pomocniczego indeksu XML i utworzenie nowego pomocniczego indeksu XML. Jednak ta opcja nie może usunąć pomocniczego indeksu XML w celu utworzenia nowego podstawowego indeksu XML lub odwrotnie.

  • Nazwy podstawowych indeksów XML mają takie same ograniczenia jak nazwy widoków.

    Nie można utworzyć indeksu XML na kolumnie typu xml w widoku, w zmiennej typu tabeli z kolumnami typu xml ani w zmiennych typu xml.

  • Aby zmienić kolumnę typu xml z nietypowej na typizowane XML lub na odwrót, używając opcji ALTER TABLE ALTER COLUMN, nie powinien istnieć indeks XML w kolumnie. Jeśli taki istnieje, należy go porzucić, zanim zostanie podjęta próba zmiany typu kolumny.

  • Opcja ARITHABORT musi być ustawiona na WŁ podczas tworzenia indeksu XML. Aby wykonywać zapytania, wstawiać, usuwać lub aktualizować wartości w kolumnie XML przy użyciu metod typu danych XML , należy ustawić tę samą opcję na połączeniu. Jeśli tak nie jest, metody typu danych XML zakończą się niepowodzeniem.

    Uwaga / Notatka

    Informacje o indeksie XML można znaleźć w widokach wykazu. Jednak sp_helpindex nie jest obsługiwana. Przykłady przedstawione w dalszej części tego tematu pokazują, jak wysyłać zapytania do widoków wykazu w celu znalezienia informacji o indeksie XML.

Podczas tworzenia lub ponownego tworzenia podstawowego indeksu XML w kolumnie typu danych XML zawierającej wartości typów xs:date schematu XML lub xs:dateTime (lub dowolnych podtypów tych typów), które mają rok krótszy niż 1, tworzenie indeksu zakończy się niepowodzeniem w programie SQL Server 2008 (10.0.x) i nowszych wersjach. Program SQL Server 2005 (9.x) zezwolił na te wartości, więc ten problem może wystąpić podczas tworzenia indeksów w bazie danych wygenerowanej w programie SQL Server 2005 (9.x). Aby uzyskać więcej informacji, zobacz Compare Typed XML to Untyped XML (Porównanie typu XML z nietypowanym kodem XML).

Przykład: tworzenie podstawowego indeksu XML

Tabela T (pk INT PRIMARY KEY, xCol XML) z nietypową kolumną XML jest używana w większości przykładów. Ten przykład można rozszerzyć na wpisany kod XML w prosty sposób. Dla uproszczenia zapytania są opisywane dla wystąpień danych XML, jak pokazano w poniższym przykładzie:

<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>

Poniższa instrukcja tworzy indeks XML o nazwie idx_xCol, w kolumnie xCol XML tabeli T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Tworzenie pomocniczego indeksu XML

Użyj instrukcji CREATE INDEX (Transact-SQL)Transact-SQL DDL, aby utworzyć pomocnicze indeksy XML i określić typ żądanego pomocniczego indeksu XML.

Podczas tworzenia pomocniczych indeksów XML należy pamiętać o następujących kwestiach:

  • Wszystkie opcje indeksowania, które mają zastosowanie do indeksu nieklastrowanego, z wyjątkiem IGNORE_DUP_KEY i ONLINE, są dozwolone w pomocniczych indeksach XML. Dla pomocniczych indeksów XML obie opcje muszą zawsze być ustawione na WYŁ.

  • Indeksy pomocnicze są partycjonowane tak samo jak podstawowy indeks XML.

  • DROP_EXISTING może spowodować usunięcie indeksu pomocniczego na tabeli użytkownika i utworzenie innego indeksu pomocniczego na tabeli użytkownika.

Aby pobrać informacje o indeksie XML, możesz wykonać zapytanie do widoku katalogu sys.xml_indexes. Kolumna secondary_type_desc w widoku wykazu sys.xml_indexes zawiera typ indeksu pomocniczego:

SELECT  *
FROM    sys.xml_indexes;

Wartości zwracane w kolumnie secondary_type_desc mogą mieć wartość NULL, PATH, VALUE lub PROPERTY. W przypadku podstawowego indeksu XML zwracana wartość to NULL.

Przykład: Tworzenie pomocniczych indeksów XML

Poniższy przykład ilustruje sposób tworzenia pomocniczych indeksów XML. W przykładzie przedstawiono również informacje o utworzonych indeksach XML.

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

Możesz wysłać zapytanie do widoku wykazu, sys.xml_indexes aby pobrać informacje o indeksach XML. Kolumna secondary_type_desc zawiera pomocniczy typ indeksu.

SELECT  *
FROM    sys.xml_indexes;

Możesz również wysłać zapytanie do widoku wykazu, aby uzyskać informacje o indeksie.

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

Możesz dodać przykładowe dane, a następnie przejrzeć informacje o indeksie 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

Zobacz także