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ı
Bu makale, seçmeli XML dizinlerini oluşturduğunuzda veya değiştirdiğinizde, düğüm yollarını nasıl belirleyeceğinizi ve dizinleme ile iyileştirme ipuçlarını nasıl kullanabileceğinizi açıklar.
Aşağıdaki deyimlerden birinde düğüm yollarını ve iyileştirme ipuçlarını aynı anda belirtirsiniz:
CREATE ifadesinin FOR yan tümcesinde. Daha fazla bilgi için bkz. CREATE SELECTIVE XML INDEX (Transact-SQL) .
ALTER ifadesinin ADD alt cümlesinde. Daha fazla bilgi için bkz. ALTER INDEX (Seçmeli XML Dizinleri) .
Seçmeli XML dizinleri hakkında daha fazla bilgi için bkz. Seçmeli XML Dizinleri (SXI).
Yazılmamış XML'de XQuery ve SQL Server türlerini anlama
Seçmeli XML dizinleri iki tür sistemi destekler: XQuery türleri ve SQL Server türleri. Dizine alınan yol, XQuery ifadesiyle eşleştirmek veya value() veri türünün yönteminin dönüş türünü eşleştirmek için kullanılabilir.
Bir dizin yoluna açıklama eklenmediğinde veya XQUERY anahtar sözcüğüyle açıklama eklendiğinde, yol bir XQuery ifadesiyle eşleşir. XQUERY açıklamalı düğüm yolları için iki çeşitleme vardır:
XQUERY anahtar sözcüğünü ve XQuery veri türünü belirtmezseniz, varsayılan eşlemeler kullanılır. Genellikle performans ve depolama ideal seviyede değildir.
XQUERY anahtar sözcüğünü ve XQuery veri türünü ve isteğe bağlı olarak diğer iyileştirme ipuçlarını belirtirseniz, mümkün olan en iyi performansı ve mümkün olan en verimli depolamayı elde edebilirsiniz. Ancak, bir atama başarısız olabilir.
Dizin yoluna SQL anahtar sözcüğü ile ek açıklama eklendiğinde, yol
value()veri türünün yönteminin dönüş tipiyle eşleşir.value()yönteminden beklediğiniz dönüş türü olan uygun SQL Server veri türünü belirtin.
XQuery ifadeleri XML türü sistemi ile value() veri türünün yöntemine uygulanan SQL Server tür sistemi arasında küçük farklar vardır. Bu farklar şunlardır:
XQuery türü sistemi sondaki boşlukların farkındadır. Örneğin, XQuery türü semantiğine göre " abc" ve "abc " dizeleri eşit değildir, SQL Server'da ise bu dizeler eşittir.
XQuery kayan nokta veri türleri özel +/- sıfır ve +/- sonsuz değerlerini destekler. Bu özel değerler SQL Server kayan nokta veri türlerinde desteklenmez.
Yazılmamış XML'deki XQuery türleri
XQuery türleri, yöntemi dahil olmak üzere
value()veri türünün tüm yöntemlerindeki XQuery ifadeleriyle eşleşmektedir.XQuery türleri şu iyileştirme ipuçlarını destekler: node(), SINGLETON, DATA TYPE ve MAXLENGTH.
Yazılmamış XML üzerinde XQuery ifadeleri için iki işlem modu arasından seçim yapabilirsiniz:
Varsayılan eşleme modu. Bu modda, seçmeli XML dizini oluştururken yalnızca yolu belirtirsiniz.
kullanıcı tarafından belirtilen eşleme modu. Bu modda hem yolu hem de isteğe bağlı iyileştirme ipuçlarını belirtirsiniz.
Varsayılan eşleme modu, her zaman güvenli ve genel olan muhafazakar bir depolama seçeneği kullanır. Herhangi bir ifade türüyle eşleşebilir. Daha fazla sayıda çalışma zamanı ataması gerektiğinden ve ikincil dizinler kullanılamadığından varsayılan eşleme modunun sınırlaması en iyi performanstan daha düşüktür.
Aşağıda, varsayılan eşlemelerle oluşturulmuş seçmeli XML dizini örneği verilmiştir. Üç yol için de varsayılan düğüm türü (xs:untypedAtomic) ve kardinalite kullanılır.
CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
mypath01 = '/a/b',
mypath02 = '/a/b/c',
mypath03 = '/a/b/d'
);
Kullanıcı tarafından belirtilen eşleme modu, daha iyi performans elde etmek için düğüm için bir tür ve kardinalite belirtmenize olanak tanır. Ancak, iyileştirilmiş performans, güvenlikten vazgeçilerek - çünkü bir dönüşüm başarısız olabilir - ve genellikten vazgeçilerek - çünkü yalnızca belirtilen tür, seçmeli XML dizini ile eşleşir - elde edilir.
Yazılmamış XML durumu için desteklenen XQuery türleri şunlardır:
xs:booleanxs:doublexs:stringxs:datexs:timexs:dateTime
Tür belirtilmezse düğümün xs:untypedAtomic veri türünde olduğu varsayılır.
Aşağıdaki şekilde gösterilen seçmeli XML dizinini iyileştirebilirsiniz:
CREATE SELECTIVE XML INDEX example_sxi_UX_optimized
ON Tbl(xmlcol)
FOR
(
mypath= '/a/b' as XQUERY 'node()',
pathX = '/a/b/c' as XQUERY 'xs:double' SINGLETON,
pathY = '/a/b/d' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON
);
-- mypath - Only the node value is needed; storage is saved.
-- pathX - Performance is improved; secondary indexes are possible.
-- pathY - Performance is improved; secondary indexes are possible; storage is saved.
Yazılmamış XML'de SQL Server türleri
SQL Server türleri,
value()yönteminin dönüş değeriyle eşleşer.SQL Server türleri şu iyileştirme ipucunu destekler: SINGLETON.
SQL Server türlerini döndüren yollar için bir tür belirtmek zorunludur.
value() yönteminde kullandığınız SQL Server türünü kullanın.
Aşağıdaki sorguyu göz önünde bulundurun:
SELECT T.record,
T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;
Belirtilen sorgu, bir NVARCHAR(200) veri türüne paketlenmiş /a/b/d yolundan bir değer döndürür, bu nedenle düğüm için belirtilmesi gereken veri türü açıktır. Ancak, düğümün kardinalitesini yazılmamış XML'de belirtmek için bir şema yoktur. Düğüm d en fazla bir kez üst düğüm baltında görüntüleneceğini belirtmek için, SINGLETON iyileştirme ipucunu kullanan bir seçmeli XML dizini oluşturun:
CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);
Yazılan XML için seçmeli XML dizini desteğini anlama
SQL Server'da yazılan XML, belirli bir XML belgesiyle ilişkilendirilmiş bir şemadır. Şema, genel belge yapısını ve düğüm türlerini tanımlar. Bir şema varsa, Kullanıcı yolları yükselttiğinde Seçmeli XML Dizini şema yapısını uygular, bu nedenle yollar için XQUERY türlerini belirtmeye gerek yoktur.
Seçmeli XML Dizini aşağıdaki XSD türlerini destekler:
xs:anyUrixs:booleanxs:datexs:dateTimexs:dayxs:decimalxs:doublexs:floatxs:intxs:integerxs:languagexs:longxs:namexs:NCNamexs:negativeIntegerxs:nmtokenxs:nonNegativeIntegerxs:nonPositiveIntegerxs:positiveIntegerxs:qnamexs:shortxs:stringxs:timexs:tokenxs:unsignedBytexs:unsignedIntxs:unsignedLongxs:unsignedShort
Kendisiyle ilişkilendirilmiş bir şemaya sahip bir belge üzerinde seçmeli XML dizini oluşturulduğunda, dizin oluşturma veya değiştirme sırasında bir XQuery türü belirtmek bir hata döndürür. Kullanıcı, yol yükseltme bölümünde SQL türü ek açıklamalarını kullanabilir. SQL türü, şemada tanımlanan XSD türünden geçerli bir dönüştürme olmalıdır veya bir hata oluşturulur. XSD'de yeterli gösterimi olan tüm SQL türleri desteklenir ve tarih/saat türleri hariçtir.
Not
Seçici XML Dizin yol terfisinde belirtilen tür, value() yöntemi dönüş değeriyle aynıysa seçici dizin kullanılır.
Aşağıdaki iyileştirme ipuçları, yazılan XML belgeleriyle kullanılabilir:
node()optimizasyon ipucu.MAXLENGTH iyileştirme ipucu, dizine alınan değeri kısaltmak için xs:string türleriyle kullanılabilir.
İyileştirme ipuçları hakkında daha fazla bilgi için bkz. İyileştirme İpuçlarını Belirtme.
Yolları belirtme
Seçmeli XML dizini, depolanan XML verilerinden çalıştırmayı beklediğiniz sorgular için uygun düğümlerin yalnızca bir alt kümesini dizine almanızı sağlar. İlgili düğümlerin alt kümesi XML belgesindeki toplam düğüm sayısından çok daha küçük olduğunda, seçmeli XML dizini yalnızca ilgili düğümleri depolar. Seçmeli XML dizininden yararlanmak için dizine alınacak düğümlerin doğru alt kümesini belirleyin.
Dizine eklemek istediğiniz düğümleri seçin
Seçmeli XML dizinine eklenecek düğümlerin doğru alt kümesini belirlemek için aşağıdaki iki ilkeyi kullanabilirsiniz.
İlke 1: Belirli bir XQuery ifadesini değerlendirmek için incelemeniz gereken tüm düğümleri dizine ekleyin.
Varlığı veya değeri XQuery ifadesinde kullanılan tüm düğümleri dizine ekleyin.
XQuery koşullarının uygulandığı ifadedeki tüm XQuery düğümlerini dizine ekleyin.
Bu makaledeki örnek XML belgesi üzerindeki aşağıdaki sorguyu göz önünde bulundurunuz:
SELECT T.record FROM myXMLTable T WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;Bu sorguyu karşılayan XML örneklerini döndürmek için, seçmeli xml dizininin her XML örneğinde iki düğümü incelemesi gerekir:
Node
c, çünkü değeri XQuery ifadesinde kullanılır.Node
b, çünkü XQuery ifadesinde düğümbüzerine bir koşul uygulanmaktadır.
İlke 2: En iyi performans için, belirli bir XQuery ifadesini değerlendirmek için gereken tüm düğümleri dizine ekleyin. Düğümlerden yalnızca bazılarını dizine eklerseniz, seçmeli XML dizini yalnızca dizine alınan düğümleri içeren alt ifadelerin değerlendirilmesini geliştirir.
Yukarıda gösterilen SELECT deyiminin performansını geliştirmek için aşağıdaki seçmeli XML dizinini oluşturabilirsiniz:
CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
path123 = '/a/b',
path124 = '/a/b/c'
);
İndeks özdeş yollar
Aynı yolları, farklı yol adları altında, aynı veri türü olarak tanımlayamazsınız. Örneğin, pathOne ve pathTwo aynı olduğundan aşağıdaki sorgu bir hata oluşturur:
CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
pathOne = 'book/authors/authorID' AS XQUERY 'xs:string',
pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);
Ancak, aynı yolları farklı adlara sahip farklı veri türleri olarak yükseltebilirsiniz. Örneğin, veri türleri farklı olduğundan aşağıdaki sorgu artık kabul edilebilir:
CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
pathOne = 'book/authors/authorID' AS XQUERY 'xs:double',
pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);
Örnekler
Aşağıda, farklı XQuery türleri için dizine eklenecek doğru düğümleri seçmeye ilişkin bazı örnekler verilmiştir.
Örnek 1
aşağıda exist() yöntemini kullanan basit bir XQuery verilmiştır:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;
Aşağıdaki tabloda, bu sorgunun seçmeli XML dizinini kullanmasına izin vermek için dizine alınması gereken düğümler gösterilmektedir.
| Dizine dahil edilecek düğüm | Bu düğümü dizine alma nedeni |
|---|---|
| /a/b/c/d/e/h | Düğüm h varlığı exist() yönteminde değerlendirilir. |
Örnek 2
Bir koşul uygulanmış olarak önceki XQuery'nin daha karmaşık bir varyasyonu aşağıda verilmiştir:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;
Aşağıdaki tabloda, bu sorgunun seçmeli XML dizinini kullanmasına izin vermek için dizine alınması gereken düğümler gösterilmektedir.
| Dizine dahil edilecek düğüm | Bu düğümü dizine alma nedeni |
|---|---|
| /a/b/c/d/e |
edüğüme bir koşul uygulanır. |
| /a/b/c/d/e/f | Düğüm f değeri koşul içinde değerlendirilir. |
Örnek 3
value() yan tümcesi içeren daha karmaşık bir sorgu aşağıdadır:
SELECT T.record,
T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;
Aşağıdaki tabloda, bu sorgunun seçmeli XML dizinini kullanmasına izin vermek için dizine alınması gereken düğümler gösterilmektedir.
| Dizine dahil edilecek düğüm | Bu düğümü dizine alma nedeni |
|---|---|
| /a/b/c/d/e |
edüğüme bir koşul uygulanır. |
| /a/b/c/d/e/f | Düğüm f değeri koşul içinde değerlendirilir. |
| /a/b/c/d/e/g | Düğüm g değeri value() yöntemi tarafından döndürülür. |
Örnek 4
Burada, bir exist() yan tümcesi içinde FLWOR yan tümcesi kullanan bir sorgu yer alır. (FLWOR adı, XQuery FLWOR ifadesini oluşturabilen beş yan tümceden gelir: for, let, where, order by ve return.)
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('
For $x in /a/b/c/d/e
Where $x/f = "SQL"
Return $x/g
') = 1;
Aşağıdaki tabloda, bu sorgunun seçmeli XML dizinini kullanmasına izin vermek için dizine alınması gereken düğümler gösterilmektedir.
| Dizine dahil edilecek düğüm | Bu düğümü dizine alma nedeni |
|---|---|
| /a/b/c/d/e | Düğüm e varlığı FLWOR yan tümcesinde değerlendirilir. |
| /a/b/c/d/e/f | Düğüm f değeri FLWOR yan tümcesinde değerlendirilir. |
| /a/b/c/d/e/g | Düğüm g varlığı exist() yöntemi ile değerlendirilir. |
İyileştirme ipuçlarını belirtme
Seçmeli XML dizini tarafından dizine alınan bir düğüm için ek eşleme ayrıntılarını belirtmek için isteğe bağlı iyileştirme ipuçlarını kullanabilirsiniz. Örneğin, düğümün veri türünü ve kardinalitesini ve verilerin yapısı hakkında belirli bilgileri belirtebilirsiniz. Bu ek bilgiler daha iyi eşlemeyi destekler. Ayrıca performansta, depolamada veya her ikisinde de iyileştirmelere neden olur.
İyileştirme ipuçlarının kullanımı isteğe bağlıdır. Güvenilir olan ancak her zaman en iyi performansı ve depolamayı sağlamayabilecek varsayılan eşlemeleri kabul edebilirsiniz.
SINGLETON ipucu gibi bazı iyileştirme ipuçları verileriniz üzerinde kısıtlamalara neden olur. Bazı durumlarda, bu kısıtlamalar karşılanmadığında hatalar oluşabilir.
İyileştirme ipuçlarının avantajları
Aşağıdaki tabloda, daha verimli depolamayı veya geliştirilmiş performansı destekleyen iyileştirme ipuçları tanımlanmıştır.
| İyileştirme ipucu | Daha verimli depolama | Geliştirilmiş performans |
|---|---|---|
| node() | Evet | Hayır |
| SİNGLETON | Hayır | Evet |
| VERİ TÜRÜ | Evet | Evet |
| MAXLENGTH | Evet | Evet |
İyileştirme ipuçları ve veri türleri
Düğümleri XQuery veya SQL Server veri türleri olarak dizinleyebilirsiniz. Aşağıdaki tabloda her veri türünde hangi iyileştirme ipuçlarının desteklendiği gösterilmektedir.
| İyileştirme ipucu | XQuery veri türleri | SQL veri türleri |
|---|---|---|
| node() | Evet | Hayır |
| SİNGLETON | Evet | Evet |
| VERİ TÜRÜ | Evet | Hayır |
| MAXLENGTH | Evet | Hayır |
node() iyileştirme ipucu
Şunlar için geçerlidir: XQuery veri türleri
Değeri tipik sorguyu değerlendirmek için gerekli olmayan bir düğüm belirtmek için node() iyileştirmesini kullanabilirsiniz. Bu ipucu, tipik sorgunun yalnızca düğümün varlığını değerlendirmesi gerektiğinde depolama gereksinimlerini azaltır. (Varsayılan olarak, seçmeli XML dizini karmaşık düğüm türleri dışında yükseltilen tüm düğümlerin değerini depolar.)
Aşağıdaki örneği göz önünde bulundurun:
SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;
Bu sorguyu değerlendirmek için seçmeli XML dizini kullanırken, b ve cdüğümlerini yükseltin. Ancak düğüm b değeri gerekli olmadığından, aşağıdaki söz dizimiyle node() ipucunu kullanabilirsiniz:
`/a/b/ as node()
Sorgu, node() ipucuyla dizine alınmış bir düğümün değerini gerektiriyorsa, seçmeli XML dizini kullanılamaz.
SINGLETON iyileştirme ipucu
Şunlar için geçerlidir: XQuery veya SQL Server veri türü
SINGLETON iyileştirme ipucu bir düğümün kardinalitesini belirtir. Bu ipucu, bir düğümün ebeveyni veya atası içinde en fazla bir kez göründüğü önceden bilindiğinden, sorgu performansını geliştirir.
Bu makaledeki örnek XML belgesini göz önünde bulundurun.
Bu belgeyi sorgulamak için seçici bir XML dizini kullanırken, düğüm d için SINGLETON ipucunu belirtebilirsiniz çünkü üst öğesinde en fazla bir kez görünüyor.
SINGLETON ipucu belirtilmişse, ancak bir düğüm ebeveyn veya ata düğümünde birden fazla kez görünüyorsa, dizini oluşturduğunuzda (mevcut veriler için) veya sorgu çalıştırdığınızda (yeni veriler için) bir hata verilir.
VERİ TÜRÜ iyileştirme ipucu
Şunlar için geçerlidir: XQuery veri türleri
VERİ TÜRÜ iyileştirme ipucu, dizine alınan düğüm için bir XQuery veya SQL Server veri türü belirtmenize olanak tanır. Veri türü, dizine alınan düğüme karşılık gelen seçmeli XML dizininin veri tablosundaki sütun için kullanılır.
Mevcut bir değeri belirtilen veri türüne atama işlemi başarısız olduğunda ekleme işlemi (dizine) başarısız olmaz; ancak, dizinin veri tablosuna null bir değer eklenir.
MAXLENGTH iyileştirme ipucu
Şunlar için geçerlidir: XQuery veri türleri
MAXLENGTH iyileştirme ipucu, xs:string verilerinin uzunluğunu sınırlamanıza olanak tanır. VARCHAR veya NVARCHAR tarih türlerini belirtirken uzunluğu belirttiğinizden, MAXLENGTH SQL Server veri türleriyle ilgili değildir.
Mevcut bir dize belirtilen MAXLENGTH değerinden uzunsa, bu değeri dizine ekleme işlemi başarısız olur.
Örnekler için örnek XML belgesi
Bu makaledeki örneklerde aşağıdaki örnek XML belgesine başvurulmlenmiştir:
<a>
<b>
<c atc="aa">10</c>
<c atc="bb">15</c>
<d atd1="dd" atd2="ddd">md </d>
</b>
<b>
<c></c>
<c atc="">117</c>
</b>
</a>