Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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