Aracılığıyla paylaş


XML dizinleri oluşturma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bu makalede, birincil ve ikincil XML dizinlerinin nasıl oluşturulacağı açıklanır.

Birincil XML dizini oluşturma

Birincil XML dizini oluşturmak için CREATE INDEX (Transact-SQL)Transact-SQL DDL deyimini kullanın. XML olmayan dizinler için kullanılabilen tüm seçenekler XML dizinlerinde desteklenmez.

XML dizini oluştururken aşağıdakilere dikkat edin:

  • Birincil XML dizini oluşturmak için, temel tablo olarak adlandırılan ve dizine alınan XML sütununu içeren tablonun, birincil anahtarı üzerinde bir kümelenmiş dizine sahip olması gerekir. Bu kümelenmiş dizin, temel tablo bölümlenmişse, birincil XML dizininin aynı bölümleme düzeni ve bölümleme işlevi kullanılarak bölümlenebileceğini sağlar.

  • XML dizini varsa, tablonun kümelenmiş birincil anahtarı değiştirilemez. Birincil anahtarı değiştirmeden önce tablodaki tüm XML dizinlerini bırakmanız gerekir.

  • Birincil XML dizini tek bir xml türü sütunda oluşturulabilir. xml türü sütununu anahtar sütun olarak kullanarak başka bir dizin türü oluşturamazsınız. Ancak xml türündeki sütununu XML olmayan bir dizine ekleyebilirsiniz. Bir tablodaki her xml türü sütunu kendi birincil XML dizinine sahip olabilir. Ancak xml türü sütunu başına yalnızca bir birincil XML dizinine izin verilir.

  • XML dizinleri, XML olmayan dizinler ile aynı ad alanında bulunur. Bu nedenle, aynı tabloda aynı ada sahip bir XML dizini ve XML olmayan dizine sahip olamazsınız.

  • IGNORE_DUP_KEY ve Çevrimiçi seçenekleri, XML dizinleri için her zaman Kapalı olarak ayarlanmıştır. Bu seçenekleri, değerini KAPALI olarak ayarlayarak belirleyebilirsiniz.

  • Kullanıcı tablosunun dosya grubu veya bölümleme bilgileri XML dizinine uygulanır ve ayrı olarak belirtilemez.

  • DROP_EXISTING dizini seçeneği birincil XML dizinini bırakabilir ve yeni bir birincil XML dizini oluşturabilir veya ikincil XML dizinini bırakıp yeni bir ikincil XML dizini oluşturabilir. Ancak bu seçenek, yeni bir birincil XML dizini oluşturmak için ikincil XML dizinini bırakamaz veya tam tersini de yapamaz.

  • Birincil XML dizin adları, görünüm adlarıyla aynı kısıtlamalara sahiptir.

    Bir görünümdeki xml türündeki sütunda, tablo değerli değişkende xml türü sütunlar veya xml türündeki değişkenler üzerinde bir xml dizini oluşturamazsınız.

  • BIR xml türü sütununu yazılmamış XML olarak değiştirmek için veya tam tersi, ALTER TABLE ALTER COLUMN seçeneğini kullanarak sütunda XML dizini bulunmamalıdır. Eğer mevcutsa, sütun türü değiştirilmeden önce iptal edilmelidir.

  • XML dizini oluşturulduğunda ARITHABORT seçeneği ON olarak ayarlanmalıdır. xml veri türü yöntemlerini kullanarak XML sütunundaki değerleri sorgulamak, eklemek, silmek veya güncelleştirmek için, bağlantıda aynı seçeneğin ayarlanması gerekir. Değilse, xml veri türü yöntemleri başarısız olur.

    Not

    XML dizini hakkındaki bilgileri katalog görünümlerinde bulabilirsiniz. Ancak sp_helpindex desteklenmez. Bu konunun devamında sağlanan örnekler, XML dizin bilgilerini bulmak için katalog görünümlerini sorgulamayı gösterir.

Bir xml veri türü sütununda, bir yıldan küçük xs:date veya xs:dateTime (veya bu türlerin alt türleri) değerlerini içeren bir birincil XML dizini oluştururken veya yeniden oluştururken, dizin oluşturma işlemi SQL Server 2008 (10.0.x) ve sonraki sürümlerde başarısız olur. SQL Server 2005 (9.x) bu değerlere izin verdi, bu nedenle SQL Server 2005'te (9.x) oluşturulan bir veritabanında dizinler oluşturulurken bu sorun oluşabilir. Daha fazla bilgi için, Yazılmış XML ile Yazılmamış XML'yi karşılaştırmabölümüne bakın.

Örnek: Birincil XML dizini oluşturma

Örneklerin çoğunda, yazılmamış XML sütununa sahip tablo T (pk INT PRIMARY KEY, xCol XML) kullanılır. Bu örnek, yazılan XML'e basit bir şekilde genişletilebilir. Kolaylık olması için, xml veri örnekleri için sorgular aşağıdaki örnekte gösterildiği gibi açıklanmıştır:

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

Aşağıdaki ifade, tablo idx_xCol'nin XML sütunu xCol üzerine Tadlı bir XML dizini oluşturur:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

İkincil XML dizini oluşturma

İkincil XML dizinleri oluşturmak ve istediğiniz ikincil XML dizininin türünü belirtmek için CREATE INDEX (Transact-SQL)Transact-SQL DDL deyimini kullanın.

İkincil XML dizinleri oluştururken aşağıdakilere dikkat edin:

  • IGNORE_DUP_KEY ve ÇEVRİMİÇİ dışında, kümelenmemiş bir dizine uygulanan tüm dizin oluşturma seçeneklerine ikincil XML dizinlerinde izin verilmektedir. İkincil XML dizinleri için iki seçenek her zaman KAPALI olarak ayarlanmalıdır.

  • İkincil dizinler, birincil XML dizini gibi bölümlenir.

  • DROP_EXISTING kullanıcı tablosuna ikincil bir dizin bırakabilir ve kullanıcı tablosunda başka bir ikincil dizin oluşturabilir.

XML dizin bilgilerini almak için sys.xml_indexes katalog görünümünü sorgulayabilirsiniz. sys.xml_indexes katalog görünümündeki secondary_type_desc sütunu, ikincil dizinin türünü sağlar:

SELECT  *
FROM    sys.xml_indexes;

secondary_type_desc sütununda döndürülen değerler NULL, PATH, VALUE veya PROPERTY olabilir. Birincil XML dizini için döndürülen değer NULL olur.

Örnek: İkincil XML dizinleri oluşturma

Aşağıdaki örnekte ikincil XML dizinlerinin nasıl oluşturulduğu gösterilmektedir. Örnekte, oluşturduğunuz XML dizinleri hakkındaki bilgiler de gösterilir.

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

XML dizinleri bilgilerini almak için sys.xml_indexes katalog görünümünü sorgulayabilirsiniz. secondary_type_desc sütunu ikincil dizin türünü sağlar.

SELECT  *
FROM    sys.xml_indexes;

Dizin bilgileri için katalog görünümünü de sorgulayabilirsiniz.

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

Örnek veriler ekleyebilir ve ardından XML dizin bilgilerini gözden geçirebilirsiniz.

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

Ayrıca bkz.