Delen via


XML-indexen maken

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

In dit artikel wordt beschreven hoe u primaire en secundaire XML-indexen maakt.

Een primaire XML-index maken

Als u een primaire XML-index wilt maken, gebruikt u de CREATE INDEX (Transact-SQL)Transact-SQL DDL-instructie. Niet alle beschikbare opties voor niet-XML-indexen worden ondersteund in XML-indexen.

Let op het volgende wanneer u een XML-index maakt:

  • Als u een primaire XML-index wilt maken, moet de tabel met de XML-kolom die wordt geïndexeerd, de basistabel genoemd, een geclusterde index hebben op de primaire sleutel. Deze geclusterde index zorgt ervoor dat als de basistabel is gepartitioneerd, de primaire XML-index kan worden gepartitioneerd met hetzelfde partitioneringsschema en dezelfde partitioneringsfunctie.

  • Als er een XML-index bestaat, kan de geclusterde primaire sleutel van de tabel niet worden gewijzigd. U moet alle XML-indexen in de tabel verwijderen voordat u de primaire sleutel wijzigt.

  • Een primaire XML-index kan worden gemaakt op één xml- typekolom. U kunt geen ander type index maken met de XML- typekolom als sleutelkolom. U kunt echter de xml- typekolom opnemen in een niet-XML-index. Elke xml- typekolom in een tabel kan een eigen primaire XML-index hebben. Er is echter slechts één primaire XML-index per xml- typekolom toegestaan.

  • XML-indexen bestaan in dezelfde naamruimte als niet-XML-indexen. Daarom kunt u geen XML-index en een niet-XML-index in dezelfde tabel met dezelfde naam hebben.

  • IGNORE_DUP_KEY en ONLINE opties zijn altijd ingesteld op UIT voor XML-indexen. U kunt deze opties opgeven met de waarde UIT.

  • De bestandsgroep- of partitioneringsgegevens van de gebruikerstabel worden toegepast op de XML-index en kunnen niet afzonderlijk worden opgegeven.

  • De DROP_EXISTING indexoptie kan een primaire XML-index verwijderen en een nieuwe primaire XML-index maken, of een secundaire XML-index verwijderen en een nieuwe secundaire XML-index maken. Deze optie kan echter geen secundaire XML-index verwijderen om een nieuwe primaire XML-index te maken of omgekeerd.

  • Primaire XML-indexnamen hebben dezelfde beperkingen als weergavenamen.

    U kunt geen XML-index maken voor een xml- kolom in een weergave, in een tabel waardevariabele met xml- typekolommen of xml--typevariabelen.

  • Als u een XML- typekolom wilt wijzigen van niet-getypt naar getypte XML, of omgekeerd, moet er met de optie ALTER TABLE ALTER COLUMN geen XML-index voor de kolom bestaan. Als er wel een bestaat, moet deze worden verwijderd voordat de wijziging van het kolomtype wordt geprobeerd.

  • De optie ARITHABORT moet worden ingesteld op AAN wanneer een XML-index wordt gemaakt. Als u waarden in de XML-kolom wilt opvragen, invoegen, verwijderen of bijwerken met behulp van xml- gegevenstypemethoden, moet dezelfde optie voor de verbinding worden ingesteld. Als dit niet het probleem is, mislukken de xml- gegevenstypemethoden.

    Notitie

    Informatie over een XML-index vindt u in catalogusweergaven. sp_helpindex wordt echter niet ondersteund. Voorbeelden die verderop in dit onderwerp worden gegeven, laten zien hoe u query's kunt uitvoeren op de catalogusweergaven om XML-indexinformatie te vinden.

Wanneer u een primaire XML-index maakt of opnieuw maakt op een xml- gegevenstypekolom die waarden bevat van de XML-schematypen xs:date of xs:dateTime (of subtypen van deze typen) met een jaar van minder dan 1, mislukt het maken van de index in SQL Server 2008 (10.0.x) en latere versies. SQL Server 2005 (9.x) heeft deze waarden toegestaan, zodat dit probleem kan optreden bij het maken van indexen in een database die is gegenereerd in SQL Server 2005 (9.x). Zie Typed XML vergelijken met niet-getypte XML-voor meer informatie.

Voorbeeld: Een primaire XML-index maken

Tabel T (pk INT PRIMARY KEY, xCol XML) met een niet-getypte XML-kolom wordt in de meeste voorbeelden gebruikt. Dit voorbeeld kan op een eenvoudige manier worden uitgebreid naar getypte XML. Voor het gemak worden query's beschreven voor XML-gegevensexemplaren, zoals wordt weergegeven in het volgende voorbeeld:

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

Met de volgende instructie maakt u een XML-index met de naam idx_xCol, in de XML-kolom xCol van de tabel T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Een secundaire XML-index maken

Gebruik de CREATE INDEX (Transact-SQL)Transact-SQL DDL-instructie om secundaire XML-indexen te maken en het gewenste type van de secundaire XML-index op te geven.

Let op het volgende wanneer u secundaire XML-indexen maakt:

  • Alle indexeringsopties die van toepassing zijn op een niet-geclusterde index, met uitzondering van IGNORE_DUP_KEY en ONLINE, zijn toegestaan voor secundaire XML-indexen. De twee opties moeten altijd worden ingesteld op UIT voor secundaire XML-indexen.

  • De secundaire indexen worden net als de primaire XML-index gepartitioneerd.

  • DROP_EXISTING kan een secundaire index in de gebruikerstabel verwijderen en een andere secundaire index maken in de gebruikerstabel.

U kunt een query uitvoeren op de sys.xml_indexes catalogusweergave om XML-indexinformatie op te halen. De kolom secondary_type_desc in de sys.xml_indexes catalogusweergave biedt het type secundaire index:

SELECT  *
FROM    sys.xml_indexes;

De waarden die worden geretourneerd in de kolom secondary_type_desc kunnen NULL, PATH, VALUE of PROPERTY zijn. Voor de primaire XML-index is de geretourneerde waarde NULL.

Voorbeeld: Secundaire XML-indexen maken

In het volgende voorbeeld ziet u hoe secundaire XML-indexen worden gemaakt. In het voorbeeld ziet u ook informatie over de XML-indexen die u hebt gemaakt.

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

U kunt een query uitvoeren op de sys.xml_indexes catalogusweergave om informatie over XML-indexen op te halen. De kolom secondary_type_desc levert het secundaire indextype.

SELECT  *
FROM    sys.xml_indexes;

U kunt ook een query uitvoeren op de catalogusweergave voor indexinformatie.

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

U kunt voorbeeldgegevens toevoegen en vervolgens de XML-indexgegevens controleren.

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

Zie ook