Megosztás a következőn keresztül:


XML-indexek létrehozása

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a cikk azt ismerteti, hogyan hozhat létre elsődleges és másodlagos XML-indexeket.

Elsődleges XML-index létrehozása

Elsődleges XML-index létrehozásához használja a CREATE INDEX (Transact-SQL)Transact-SQL DDL-utasítást. Az XML-indexek esetében nem támogatott minden beállítás, ami nem-XML indexeknél elérhető.

Xml-index létrehozásakor vegye figyelembe a következőket:

  • Elsődleges XML-index létrehozásához az indexelt XML-oszlopot tartalmazó táblának ( az alaptáblának) fürtözött indexet kell tartalmaznia az elsődleges kulcson. Ez a fürtözött index gondoskodik arról, hogy az alaptábla particionálása esetén az elsődleges XML-indexet ugyanazzal a particionálási sémával és particionálási függvénnyel lehessen particionelni.

  • Ha létezik XML-index, a tábla elsődleges kulcsa nem módosítható. Az elsődleges kulcs módosítása előtt törölnie kell az összes XML-indexet a tábláról.

  • Az elsődleges XML-indexek egyetlen XML- típusú oszlopon hozhatók létre. Az xml típusú oszlop kulcsoszlopként nem hozható létre más típusú index. Az xml típusú oszlopot azonban belefoglalhatja egy nem XML-indexbe. A tábla minden xml- típusú oszlopának saját elsődleges XML-indexe lehet. Azonban csak egy elsődleges XML-index engedélyezett xml- típusú oszloponként.

  • Az XML-indexek ugyanabban a névtérben találhatók, mint a nem XML-indexek. Ezért nem lehet XML-index és nem XML-index ugyanazon a táblán ugyanazzal a névvel.

  • IGNORE_DUP_KEY és ONLINE beállításai az XML-indexek esetében mindig ki vannak kapcsolva. Ezeket a beállításokat a KI értékével adhatja meg.

  • A felhasználói tábla fájlcsoport- vagy particionálási adatai az XML-indexre lesznek alkalmazva, és nem adhatók meg külön.

  • A DROP_EXISTING index lehetőség elvethet egy elsődleges XML-indexet, és létrehozhat egy új elsődleges XML-indexet, vagy elvethet egy másodlagos XML-indexet, és létrehozhat egy új másodlagos XML-indexet. Ez a beállítás azonban nem tud elvetni egy másodlagos XML-indexet egy új elsődleges XML-index létrehozásához, vagy fordítva.

  • Az elsődleges XML-indexnevekre ugyanazok a korlátozások vonatkoznak, mint a nézetnevekre.

    Nem hozhat létre XML-indexet egy nézet xml típusú oszlopán, egy táblában értékváltozót tartalmazó oszlopokon xml típusú, vagy xml típusú változókon.

  • Ha egy XML- típusú oszlopot nem típusos XML-ről típusos XML-re szeretne módosítani, vagy fordítva, az ALTER TABLE ALTER COLUMN beállítással nem létezhet XML-index az oszlopon. Ha létezik ilyen, el kell dobni az oszloptípus-módosítási kísérlet előtt.

  • Az ARITHABORT beállítást BE értékre kell állítani egy XML-index létrehozásakor. Az XML-oszlop értékeinek lekérdezéséhez, beszúrásához, törléséhez vagy frissítéséhez xml adattípus-metódusok használatával ugyanezt a beállítást kell beállítani a kapcsolaton. Ha nem, az xml adattípus-metódusok sikertelenek lesznek.

    Jegyzet

    Az XML-indexekkel kapcsolatos információk a katalógusnézetekben találhatók. A sp_helpindex azonban nem támogatott. A témakör későbbi részében ismertetett példák bemutatják, hogyan kérdezhetők le a katalógusnézetek az XML-index információinak megkereséséhez.

Ha egy XML- adattípus-oszlopban egy elsődleges XML-indexet hoz létre vagy hoz újra létre, amely xs:date vagy xs:dateTime (vagy ezen típusok altípusai) XML-sématípusok 1 évnél korábbi értékeit tartalmazza, az index létrehozása sikertelen lesz az SQL Server 2008 (10.0.x) és újabb verzióiban. Az SQL Server 2005 (9.x) engedélyezte ezeket az értékeket, így ez a probléma akkor fordulhat elő, ha indexeket hoz létre egy SQL Server 2005-ben létrehozott adatbázisban (9.x). További információ: A gépelt XML és a nem beírt XMLösszehasonlítása.

Példa: Elsődleges XML-index létrehozása

A legtöbb példában egy nem beírt XML-oszlopot tartalmazó táblázat T (pk INT PRIMARY KEY, xCol XML) használ. Ez a példa egyszerűen kiterjeszthető beírt XML-fájlra. Az egyszerűség kedvéért a lekérdezések az XML-adatpéldányokhoz tartoznak, ahogyan az alábbi példában is látható:

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

Az alábbi utasítás létrehoz egy idx_xColnevű XML-indexet a xColtábla XML-oszlopában T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Másodlagos XML-index létrehozása

A CREATE INDEX (Transact-SQL)Transact-SQL DDL-utasítással másodlagos XML-indexeket hozhat létre, és megadhatja a kívánt másodlagos XML-index típusát.

A másodlagos XML-indexek létrehozásakor vegye figyelembe a következőket:

  • A másodlagos XML-indexeken az összes olyan indexelési beállítás engedélyezett, amely egy nemclustered indexre vonatkozik, kivéve a IGNORE_DUP_KEY és az ONLINE beállítást. A másodlagos XML-indexek esetében a két beállítást mindig KI értékre kell állítani.

  • A másodlagos indexek particionálása ugyanúgy, mint az elsődleges XML-index.

  • DROP_EXISTING elvethet egy másodlagos indexet a felhasználói táblában, és létrehozhat egy másik másodlagos indexet a felhasználói táblában.

Az XML-index információinak lekéréséhez lekérdezheti a sys.xml_indexek katalógusnézetét. A sys.xml_indexes katalógusnézet secondary_type_desc oszlopa a másodlagos index típusát adja meg:

SELECT  *
FROM    sys.xml_indexes;

A secondary_type_desc oszlopban visszaadott értékek lehetnek NULL, PATH, VALUE vagy PROPERTY. Az elsődleges XML-index esetében a visszaadott érték NULL.

Példa: Másodlagos XML-indexek létrehozása

Az alábbi példa a másodlagos XML-indexek létrehozását mutatja be. A példa a létrehozott XML-indexekről is tartalmaz információkat.

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

Az XML-indexek adatainak lekéréséhez lekérdezheti a sys.xml_indexes katalógusnézetet. A secondary_type_desc oszlop a másodlagos indextípust biztosítja.

SELECT  *
FROM    sys.xml_indexes;

A katalógusnézetből is lekérdezheti az indexinformációkat.

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

Hozzáadhat mintaadatokat, majd áttekintheti az XML-index adatait.

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

Lásd még: