Dela via


Skapa XML-index

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

I den här artikeln beskrivs hur du skapar primära och sekundära XML-index.

Skapa ett primärt XML-index

Om du vill skapa ett primärt XML-index använder du CREATE INDEX (Transact-SQL)Transact-SQL DDL-instruktion. Alla alternativ som är tillgängliga för icke-XML-index stöds inte i XML-index.

Observera följande när du skapar ett XML-index:

  • Om du vill skapa ett primärt XML-index måste tabellen som innehåller XML-kolumnen som indexeras, kallad bastabellen, ha ett klustrat index på primärnyckeln. Det här klustrade indexet säkerställer att om bastabellen partitioneras kan det primära XML-indexet partitioneras med hjälp av samma partitioneringsschema och partitioneringsfunktion.

  • Om det finns ett XML-index kan den klustrade primärnyckeln i tabellen inte ändras. Du måste släppa alla XML-index i tabellen innan du ändrar primärnyckeln.

  • Ett primärt XML-index kan skapas på en enda xml- typkolumn. Du kan inte skapa någon annan typ av index med XML- typkolumn som en nyckelkolumn. Du kan dock inkludera kolumnen xml- i ett icke-XML-index. Varje XML- typkolumn i en tabell kan ha ett eget primärt XML-index. Endast ett primärt XML-index per xml- typkolumn tillåts dock.

  • XML-index finns i samma namnområde som icke-XML-index. Därför kan du inte ha ett XML-index och ett icke-XML-index i samma tabell med samma namn.

  • Alternativen IGNORE_DUP_KEY och ONLINE är alltid inställda på OFF för XML-index. Du kan ange de här alternativen med värdet OFF.

  • Filgruppen eller partitioneringsinformationen i användartabellen tillämpas på XML-indexet och kan inte anges separat.

  • Alternativet DROP_EXISTING index kan släppa ett primärt XML-index och skapa ett nytt primärt XML-index, eller släppa ett sekundärt XML-index och skapa ett nytt sekundärt XML-index. Det här alternativet kan dock inte släppa ett sekundärt XML-index för att skapa ett nytt primärt XML-index eller tvärtom.

  • Primära XML-indexnamn har samma begränsningar som visningsnamn.

    Du kan inte skapa ett XML-index på en xml- typkolumn i en vy, i en tabell värdevariabel med xml- typkolumner eller xml- typvariabler.

  • sv-SE: Om du vill ändra en XML- typkolumn från otypad till typerad XML, eller vice versa, med alternativet ALTER TABLE ALTER COLUMN bör det inte finnas något XML-index på kolumnen. Om det finns en måste den tas bort innan kolumntypsändringen provas.

  • Alternativet ARITHABORT måste anges till PÅ när ett XML-index skapas. Om du vill ställa frågor mot, infoga, ta bort eller uppdatera värden i XML-kolumnen med hjälp av XML- datatypsmetoder måste samma alternativ anges för anslutningen. Om så inte är fallet, kommer metoder för xml- datatyper att misslyckas.

    Not

    Information om ett XML-index finns i katalogvyer. Men sp_helpindex stöds inte. Exempel som visas senare i det här avsnittet visar hur du frågar katalogvyerna för att hitta XML-indexinformation.

När du skapar eller återskapar ett primärt XML-index på en XML- datatypkolumn som innehåller värden för XML-schematyperna xs:date eller xs:dateTime (eller några undertyper av dessa typer) som har ett år på mindre än 1, misslyckas indexskapandet i SQL Server 2008 (10.0.x) och senare versioner. SQL Server 2005 (9.x) tillät dessa värden, så det här problemet kan uppstå när du skapar index i en databas som genereras i SQL Server 2005 (9.x). Mer information finns i Compare Typed XML to Untyped XML.

Exempel: Skapa ett primärt XML-index

Tabell T (pk INT PRIMARY KEY, xCol XML) med en otypad XML-kolumn används i de flesta av exemplen. Det här exemplet kan utökas till att skriva XML på ett enkelt sätt. För enkelhetens skull beskrivs frågor för XML-datainstanser enligt följande exempel:

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

Följande instruktion skapar ett XML-index med namnet idx_xColi XML-kolumnen xCol i tabellen T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Skapa ett sekundärt XML-index

Använd CREATE INDEX (Transact-SQL)Transact-SQL DDL-instruktionen för att skapa sekundära XML-index och ange vilken typ av sekundärt XML-index du vill använda.

Observera följande när du skapar sekundära XML-index:

  • Alla indexeringsalternativ som gäller för ett icke-grupperat index, förutom IGNORE_DUP_KEY och ONLINE, är tillåtna för sekundära XML-index. De två alternativen måste alltid anges till AV för sekundära XML-index.

  • De sekundära indexen partitioneras precis som det primära XML-indexet.

  • DROP_EXISTING kan släppa ett sekundärt index i användartabellen och skapa ett annat sekundärt index i användartabellen.

Du kan använda sys.xml_indexes katalogvyn för att hämta XML-indexinformation. Kolumnen secondary_type_desc i sys.xml_index katalogvyn innehåller typen av sekundärt index:

SELECT  *
FROM    sys.xml_indexes;

Värdena som returneras i kolumnen secondary_type_desc kan vara NULL, PATH, VALUE eller PROPERTY. För det primära XML-indexet är värdet som returneras NULL.

Exempel: Skapa sekundära XML-index

I följande exempel visas hur sekundära XML-index skapas. Exemplet visar också information om DE XML-index som du skapade.

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

Du kan fråga katalogvyn sys.xml_indexes för att hämta information om XML-index. Kolumnen secondary_type_desc innehåller den sekundära indextypen.

SELECT  *
FROM    sys.xml_indexes;

Du kan också använda katalogvyn för indexinformation.

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

Du kan lägga till exempeldata och sedan granska XML-indexinformationen.

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

Se även