Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
XML dizinleri xml veri türü sütunlarında oluşturulabilir. Sütundaki XML örnekleri üzerinde tüm etiketleri, değerleri ve yolları dizine ekler, bu da sorgu performansını artırır. Uygulamanız aşağıdaki durumlarda xml dizininden yararlanabilir:
XML sütunlarındaki sorgular iş yükünüzde yaygındır. Veri değişikliği sırasında XML dizini bakım maliyeti dikkate alınmalıdır.
XML değerleriniz görece büyük ve alınan bölümler nispeten küçük. Dizinin oluşturulması, çalışma zamanında tüm verilerin ayrıştırılmasını önler ve verimli sorgu işleme için dizin aramalarından yararlanır.
SQL Server 2022 (16.x) ve sonraki sürümler ile Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı ve Azure SQL Yönetilen Örneği'nden başlayarak, HEM XML sütunları hem de dizinleri için satır dışı XML verilerini sıkıştırmak için XML sıkıştırmayı kullanabilirsiniz. XML sıkıştırma, veri depolama kapasitesi gereksinimlerini azaltır.
XML dizinleri aşağıdaki kategorilere ayrılır:
- Birincil XML dizini
- İkincil XML dizini
Xml türü sütunundaki ilk dizin birincil XML dizini olmalıdır. Birincil XML dizini kullanılarak aşağıdaki ikincil dizin türleri desteklenir: PATH, VALUE ve PROPERTY. Sorguların türüne bağlı olarak, bu ikincil dizinler sorgu performansını artırmaya yardımcı olabilir.
Uyarı
Xml veri türüyle çalışmak için veritabanı seçenekleri doğru ayarlanmadığı sürece XML dizini oluşturamaz veya değiştiremezsiniz. Daha fazla bilgi için bkz. XML Sütunlarıyla arama Full-Text kullanma.
XML örnekleri , xml türü sütunlarında büyük ikili nesneler (BLOB' lar) olarak depolanır. Bu XML örnekleri büyük olabilir ve xml veri türü örneklerinin depolanmış ikili gösterimi 2 GB'a kadar olabilir. Dizin olmadan, bu ikili büyük nesneler bir sorguyu değerlendirmek için çalışma zamanında parçalanır. Bu parçalama zaman alabilir. Örneğin, aşağıdaki sorguyu göz önüne alın:
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1;
Yan tümcesindeki WHERE koşulu karşılayan XML örneklerini seçmek için, tablonun Production.ProductModel her satırındaki XML ikili büyük nesnesi (BLOB) çalışma zamanında parçalanır. Ardından, (/PD:ProductDescription/@ProductModelID[.="19"] ifadesi exist() yönteminde değerlendirilir. Bu çalışma zamanı parçalama işlemi, sütunda depolanan örneklerin boyutuna ve sayısına bağlı olarak maliyetli olabilir.
XML ikili büyük nesnelerini (BLOB' lar) sorgulamak uygulama ortamınızda ortaksa, xml türü sütunlarının dizinini oluşturmanıza yardımcı olur. Ancak, veri değişikliği sırasında dizinin bakımının yapılmasıyla ilişkili bir maliyet vardır.
Birincil XML dizini
Birincil XML dizini, XML sütunundaki XML örnekleri içindeki tüm etiketleri, değerleri ve yolları dizine alır. Birincil XML dizini oluşturmak için, XML sütununun bulunduğu tablonun birincil anahtarında kümelenmiş bir dizin olmalıdır. SQL Server, birincil XML dizinindeki satırları XML sütununu içeren tablodaki satırlarla ilişkilendirmek için bu birincil anahtarı kullanır.
Birincil XML dizini, xml veri türü sütunundaki XML BLOB'larının parçalanmış ve kalıcı bir gösterimidir. Sütundaki her XML ikili büyük nesnesi (BLOB) için dizin birkaç veri satırı oluşturur. Dizindeki satır sayısı, XML ikili büyük nesnesindeki düğüm sayısına yaklaşık olarak eşittir. Sorgu tam XML örneğini aldığında, SQL Server örneği XML sütunundan sağlar. XML örnekleri içindeki sorgular birincil XML dizinini kullanır ve dizinin kendisini kullanarak skaler değerleri veya XML alt ağaçlarını döndürebilir.
Her satır aşağıdaki düğüm bilgilerini depolar:
Öğe veya öznitelik adı gibi etiket adı.
Düğüm değeri.
Öğe düğümü, öznitelik düğümü veya metin düğümü gibi düğüm türü.
İç düğüm tanımlayıcısı ile temsil edilen belge sırası bilgileri.
Her düğümden XML ağacının köküne giden yol. Bu sütunda sorguda yol ifadeleri aranıyor.
Temel tablonun birincil anahtarı. Temel tablonun birincil anahtarı, temel tabloyla geri birleşim için birincil XML dizininde çoğaltılır ve temel tablonun birincil anahtarındaki en fazla sütun sayısı 15 ile sınırlıdır.
Bu düğüm bilgileri, belirtilen sorgu için XML sonuçlarını değerlendirmek ve oluşturmak için kullanılır. İyileştirme amacıyla etiket adı ve düğüm türü bilgileri tamsayı değerleri olarak kodlanır ve Yol sütunu aynı kodlamayı kullanır. Ayrıca, yalnızca yol sonu bilindiğinde yolların eşleşmesine olanak tanımak için yollar ters sırada depolanır. Örneğin:
-
//ContactRecord/PhoneNumberyalnızca son iki adımın bilindiği yer
VEYA
-
/Book/*/Titleburada joker karakter*ifadenin ortasında belirtilir.
Sorgu işlemcisi , xml Veri Türü Yöntemleri içeren sorgular için birincil XML dizinini kullanır ve birincil dizinin kendisinden skaler değerler veya XML alt ağaçlarını döndürür. (Bu dizin, XML örneğini yeniden oluşturmak için gerekli tüm bilgileri depolar.)
Örneğin, aşağıdaki sorgu tablodaki CatalogDescriptionxml türü sütununda ProductModel depolanan özet bilgileri döndürür. Sorgu, katalog açıklaması <Summary> açıklamasını da depolayan ürün modelleri için yalnızca <Features> bilgiyi döndürür.
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query(' /PD:ProductDescription/PD:Summary') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1
Birincil XML diziniyle ilgili olarak, temel tablodaki her XML ikili büyük nesne örneğini parçalama yerine, dizindeki her XML ikili büyük nesnesine karşılık gelen satırlar, yönteminde exist() belirtilen ifade için sıralı olarak aranır. Dizin içinde Path sütununda yol bulunursa, <Summary> öğesi ile birlikte alt ağaçları birincil XML dizininden alınır ve sonucunda query() yöntemi ile XML ikili büyük nesnesine dönüştürülür.
Tam XML örneği alınırken birincil XML dizini kullanılmaz. Örneğin, aşağıdaki sorgu tablodan belirli bir ürün modeli için üretim yönergelerini açıklayan xml örneğinin tamamını alır.
USE AdventureWorks2022;
SELECT Instructions
FROM Production.ProductModel
WHERE ProductModelID = 7;
İkincil XML dizinleri
Arama performansını geliştirmek için ikincil XML dizinleri oluşturabilirsiniz. İkincil dizinler oluşturabilmeniz için önce bir birincil XML dizini bulunmalıdır. Türler şunlardır:
PATH ikincil XML dizini
VALUE ikincil XML dizini
PROPERTY ikincil XML dizini
Bir veya daha fazla ikincil dizin oluşturmaya yönelik bazı yönergeler aşağıdadır:
İş yükünüz XML sütunlarında yol ifadelerini önemli ölçüde kullanıyorsa, PATH ikincil XML dizini büyük olasılıkla iş yükünüzü hızlandırmıştır. En yaygın durum, Yönteminin Transact-SQL'in
exist()WHERE yan tümcesindeki XML sütunlarında kullanılmasıdır.İş yükünüz yol ifadelerini kullanarak tek tek XML örneklerinden birden çok değer alırsa, PROPERTY dizinindeki her XML örneğindeki yolları kümeleme yararlı olabilir. Bu senaryo genellikle bir nesnenin özellikleri getirildiğinde ve birincil anahtar değeri bilindiğinde bir özellik paketi senaryosunda gerçekleşir.
İş yükünüz, bu değerleri içeren öğe veya öznitelik adlarını bilmeden XML örnekleri içindeki değerleri sorgulamayı içeriyorsa, VALUE dizinini oluşturmak isteyebilirsiniz. Bu, genellikle
//author[last-name="Howard"]gibi alt eksen aramalarında,<author>öğelerinin hiyerarşinin herhangi bir düzeyinde gerçekleşebileceği durumlarda meydana gelir. Ayrıca, sorgunun/book [@* = "novel"]değerine<book>sahip bazı özniteliklere sahip öğeleri aradığı"novel"gibi joker karakter sorgularında da gerçekleşir.
PATH ikincil XML dizini
Sorgularınız genellikle xml türü sütunlarında yol ifadeleri belirtiyorsa, PATH ikincil dizini aramayı hızlandırabilir. Bu makalede daha önce açıklandığı gibi, WHERE yan tümcesinde yöntemi belirten exist() sorgularınız olduğunda birincil dizin yararlı olur. PATH ikincil dizini eklerseniz, bu tür sorgularda arama performansını da geliştirebilirsiniz.
Birincil XML dizini, çalışma zamanında XML ikili büyük nesnelerini parçalamaktan kaçınsa da, yol ifadelerine dayalı sorgular için en iyi performansı sağlamayabilir. Bir XML ikili büyük nesnesine karşılık gelen birincil XML dizinindeki tüm satırlar büyük XML örnekleri için sıralı olarak arandığından, sıralı arama yavaş olabilir. Bu durumda, birincil dizindeki yol değerleri ve düğüm değerleri üzerinde oluşturulmuş ikincil bir dizine sahip olmak dizin aramasını önemli ölçüde hızlandırabilir. PATH ikincil dizininde yol ve düğüm değerleri, yolları ararken daha verimli aramalar sağlayan anahtar sütunlardır. Sorgu iyileştiricisi, aşağıda gösterilen ifadeler gibi ifadeler için PATH dizinini kullanabilir:
-
/root/Locationyalnızca bir yol belirleyen
VEYA
-
/root/Location/@LocationID[.="10"]burada hem yol hem de düğüm değeri belirtilir.
Aşağıdaki sorgu, PATH dizininin nerede yararlı olduğunu gösterir:
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1;
Sorgudaki /PD:ProductDescription/@ProductModelID yönteminde, yol ifadesi "19" ve değeri exist(), PATH dizininin anahtar alanlarına karşılık gelir. Bu, PATH dizininde doğrudan aramaya olanak tanır ve birincil dizindeki yol değerleri için sıralı aramadan daha iyi arama performansı sağlar.
VALUE ikincil XML dizini
Sorgular değer tabanlıysa (örneğin, /Root/ProductDescription/@*[. = "Mountain Bike"] veya //ProductDescription[@Name = "Mountain Bike"]) ve yol tam olarak belirtilmemişse veya joker karakter içeriyorsa, birincil XML dizinindeki düğüm değerleri üzerinde oluşturulmuş ikincil bir XML dizini oluşturarak daha hızlı sonuçlar elde edebilirsiniz.
VALUE dizininin anahtar sütunları birincil XML dizininin (düğüm değeri ve yolu) şeklindedir. İş yükünüz, değerleri içeren öğe veya öznitelik adlarını bilmeden XML örneklerinden değerleri sorgulamayı içeriyorsa, VALUE dizini yararlı olabilir. Örneğin, aşağıdaki ifade value dizinine sahip olmanın avantajını elde eder:
//author[LastName="someName"]öğesinin değerini bildiğiniz, ancak<LastName>üst öğesi herhangi bir yerde gerçekleşebilir./book[@* = "someValue"]burada sorgu, değerine<book>sahip bazı özniteliklere sahip olan öğeyi arar"someValue".
Aşağıdaki sorgu ContactID tablosundan Contact döndürür.
WHERE yan tümcesi, AdditionalContactInfo değerlerini xml türü sütununda arayan bir filtreyi belirtir. Kişi kimlikleri yalnızca ilgili ek kişi bilgileri XML ikili büyük nesnesi belirli bir telefon numarası içeriyorsa döndürülür. XML'deki telephoneNumber öğesi herhangi bir yerde görünebileceğinden, yol ifadesinde alt veya kendisi ekseni belirtilir.
;WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT
)
SELECT ContactID
FROM Person.Contact
WHERE AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1;
Bu durumda, <number> için arama değeri bilinir, ancak XML örneğinde herhangi bir yerde telephoneNumber öğesinin alt öğesi olarak görünebilir. Bu tür bir sorgu, belirli bir değere dayalı dizin aramasından yararlanabilir.
ÖZELLİK ikincil dizin
Tek tek XML örneklerinden bir veya daha fazla değer alan sorgular PROPERTY dizininden yararlanabilir. Bu senaryo, bir nesnenin birincil anahtar değeri bilindiğinde ve value() türünün yöntemini kullanarak nesne özelliklerini aldığınızda meydana gelir.
PROPERTY dizini, PK'nin temel tablonun birincil anahtarı olduğu birincil XML dizininin sütunlarında (PK, yol ve düğüm değeri) oluşturulur.
Örneğin, ürün modeli 19 için, aşağıdaki sorgu ProductModelID yöntemini kullanarak ProductModelName ve value() öznitelik değerlerini alır. PROPERTY dizini birincil XML dizinini veya diğer ikincil XML dizinlerini kullanmak yerine daha hızlı yürütme sağlayabilir.
;WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS ModelID,
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') AS ModelName
FROM Production.ProductModel
WHERE ProductModelID = 19;
Bu makalenin devamında açıklanan farklar dışında, xml türü sütunu üzerinde XML dizini oluşturmak, xml türü olmayan bir sütunda dizin oluşturmaya benzer. XML dizinlerini oluşturmak ve yönetmek için aşağıdaki Transact-SQL DDL deyimleri kullanılabilir:
- İNDEKS OLUŞTUR (Transact-SQL)
- ALTER INDEX (Transact-SQL)
- DROP INDEX (Transact-SQL)
XML sıkıştırma
Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri ve Azure SQL Veritabanı'nda, Microsoft Fabric'teki SQL veritabanı ve Azure SQL Yönetilen Örneği.
XML sıkıştırmanın etkinleştirilmesi, XML veri türüyle ilişkili verilerin fiziksel depolama biçimini sıkıştırılmış ikili biçime değiştirir, ancak XML veri söz dizimini veya semantiğini değiştirmez. XML sıkıştırması için bir veya daha fazla tablo etkinleştirildiğinde uygulama değişiklikleri gerekli değildir.
YALNıZCA XML veri türü XML sıkıştırmadan etkilenir. XML verileri Xpress Sıkıştırma Algoritması ile sıkıştırılır. Mevcut XML dizinleri veri sıkıştırma kullanılarak sıkıştırılır. XML sıkıştırma etkinleştirildiğinde xml dizinleri için dahili olarak veri sıkıştırma etkinleştirilir.
XML sıkıştırma, aynı tablolarda veri sıkıştırma ile yan yana etkinleştirilebilir.
XML dizinleri tablonun sıkıştırma özelliğini devralmıyor. Dizinleri sıkıştırmak için XML dizinlerinde XML sıkıştırmayı açıkça etkinleştirmeniz gerekir.
İkincil XML dizinleri, birincil XML dizininin sıkıştırma özelliğini devralmıyor.
Varsayılan olarak, dizin oluşturulduğunda XML dizinleri için XML sıkıştırma ayarı KAPALI olarak ayarlanır.
XML dizinleri hakkında bilgi alma
XML dizin girdileri katalog görünümünde sys.indexes diziniyle type3birlikte görüntülenir. Ad sütunu XML dizininin adını içerir.
XML dizinleri de katalog görünümünde sys.xml_indexeskaydedilir. Bu, sys.indexes'nin tüm sütunlarını ve XML dizinleri için yararlı olan belirli sütunları içerir. Sütundaki değer NULL birincil XML dizinini gösterir; secondary_type, P ve R değerleri sırasıyla PATH, PROPERTY ve VALUE ikincil XML dizinleri için V sütununda kullanılır.
XML dizinlerinin alan kullanımı, tablo değerli fonksiyon sys.dm_db_index_physical_stats içinde bulunabilir. Tüm dizin türleri için, kaplanmış veri sayfalarının sayısı, bayt cinsinden ortalama satır boyutu ve kayıt sayısı gibi bilgiler sağlar. Buna XML dizinleri de dahildir. Bu bilgiler her veritabanı bölümü için kullanılabilir. XML dizinleri, temel tablonun aynı bölümleme düzenini ve bölümleme işlevini kullanır.