Bagikan melalui


Tentukan jalur dan petunjuk pengoptimalan untuk indeks XML selektif

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Artikel ini menjelaskan cara menentukan jalur simpul ke petunjuk indeks dan pengoptimalan untuk pengindeksan saat Anda membuat atau mengubah indeks XML selektif.

Anda menentukan jalur node dan petunjuk pengoptimalan secara bersamaan dalam salah satu pernyataan berikut:

Untuk informasi selengkapnya tentang indeks XML selektif, lihat Indeks XML Selektif (SXI).

Memahami jenis XQuery dan SQL Server dalam XML yang tidak diketik

Indeks XML selektif mendukung dua sistem jenis: Jenis XQuery dan jenis SQL Server. Jalur terindeks dapat digunakan untuk mencocokkan ekspresi XQuery, atau untuk mencocokkan jenis value() pengembalian metode tipe data xml .

  • Saat jalur ke indeks tidak dianotasi, atau diannotasi dengan kata kunci XQUERY, jalur cocok dengan ekspresi XQuery. Ada dua variasi untuk jalur simpul yang dianotasi XQUERY:

    • Jika Anda tidak menentukan kata kunci XQUERY dan jenis data XQuery, pemetaan default akan digunakan. Biasanya performa dan penyimpanan tidak optimal.

    • Jika Anda menentukan kata kunci XQUERY dan jenis data XQuery, dan secara opsional petunjuk pengoptimalan lainnya, maka Anda dapat mencapai performa terbaik dan penyimpanan yang paling efisien. Namun, pemeran dapat gagal.

  • Ketika jalur ke indeks dianomasi dengan kata kunci SQL, jalur cocok dengan jenis value() pengembalian metode jenis data xml . Tentukan jenis data SQL Server yang sesuai, yang merupakan jenis pengembalian yang Anda harapkan value() dari metode .

Ada perbedaan halus antara sistem jenis XML ekspresi XQuery dan sistem jenis SQL Server yang diterapkan ke value() metode tipe data xml . Perbedaan ini mencakup hal-hal berikut:

  • Sistem jenis XQuery mengetahui spasi berikutnya. Misalnya, menurut semantik jenis XQuery, string "abc" dan "abc" tidak sama, sementara di SQL Server string ini sama.

  • Jenis data titik float XQuery mendukung nilai khusus +/- nol dan +/- tak terbatas. Nilai khusus ini tidak didukung dalam jenis data titik floating SQL Server.

Jenis XQuery dalam XML yang tidak dititik

  • Jenis XQuery cocok dengan ekspresi XQuery di semua metode jenis data xml termasuk value() metode .

  • Jenis XQuery mendukung petunjuk pengoptimalan ini: node(), SINGLETON, JENIS DATA, dan MAXLENGTH.

Untuk ekspresi XQuery melalui XML yang tidak ditiru, Anda dapat memilih antara dua mode operasi:

  • Mode pemetaan default. Dalam mode ini, Anda hanya menentukan jalur saat membuat indeks XML selektif.

  • Mode pemetaan yang ditentukan pengguna. Dalam mode ini, Anda menentukan jalur dan petunjuk pengoptimalan opsional.

Mode pemetaan default menggunakan opsi penyimpanan konservatif, yang selalu aman dan umum. Ini dapat mencocokkan jenis ekspresi apa pun. Batasan mode pemetaan default kurang dari performa optimal, karena peningkatan jumlah cast runtime diperlukan, dan indeks sekunder tidak tersedia.

Berikut adalah contoh indeks XML selektif yang dibuat dengan pemetaan default. Untuk ketiga jalur, jenis node default (xs:untypedAtomic) dan kardinalitas digunakan.

CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
    mypath01 =  '/a/b',
    mypath02 = '/a/b/c',
    mypath03 = '/a/b/d'
);

Mode pemetaan yang ditentukan pengguna memungkinkan Anda menentukan jenis dan kardinalitas untuk simpul untuk mendapatkan performa yang lebih baik. Namun, peningkatan performa ini dicapai dengan menyerahkan keamanan - karena cast dapat gagal - dan generalitas - karena hanya jenis yang ditentukan yang cocok dengan indeks XML selektif.

Jenis XQuery yang didukung untuk kasus XML yang tidak dititik adalah:

  • xs:boolean
  • xs:double
  • xs:string
  • xs:date
  • xs:time
  • xs:dateTime

Jika jenis tidak ditentukan, simpul diasumsikan dari xs:untypedAtomic jenis data.

Anda dapat mengoptimalkan indeks XML selektif yang diperlihatkan dengan cara berikut:

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.

Jenis SQL Server dalam XML yang tidak diketik

  • Jenis SQL Server cocok dengan nilai value() pengembalian metode.

  • Jenis SQL Server mendukung petunjuk pengoptimalan ini: SINGLETON.

Menentukan jenis wajib untuk jalur yang mengembalikan jenis SQL Server. Gunakan jenis SQL Server yang sama dengan yang akan Anda gunakan dalam metode .value()

Pertimbangkan kueri berikut:

SELECT T.record,
    T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;

Kueri yang ditentukan mengembalikan nilai dari jalur /a/b/d yang dikemas ke dalam jenis data NVARCHAR(200), sehingga jenis data yang ditentukan untuk simpul sudah jelas. Namun, tidak ada skema untuk menentukan kardinalitas simpul dalam XML yang tidak diketik. Untuk menentukan bahwa simpul d muncul paling banyak sekali di bawah simpul binduknya , buat indeks XML selektif yang menggunakan petunjuk pengoptimalan SINGLETON sebagai berikut:

CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
    node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);

Memahami dukungan indeks XML selektif untuk XML yang ditik

XML yang diketik di SQL Server adalah skema yang terkait dengan dokumen XML tertentu. Skema mendefinisikan struktur dokumen keseluruhan dan jenis simpul. Jika ada skema, Indeks XML Selektif menerapkan struktur skema saat pengguna mempromosikan jalur, sehingga tidak perlu menentukan jenis XQUERY untuk jalur.

Indeks XML Selektif mendukung jenis XSD berikut:

  • xs:anyUri
  • xs:boolean
  • xs:date
  • xs:dateTime
  • xs:day
  • xs:decimal
  • xs:double
  • xs:float
  • xs:int
  • xs:integer
  • xs:language
  • xs:long
  • xs:name
  • xs:NCName
  • xs:negativeInteger
  • xs:nmtoken
  • xs:nonNegativeInteger
  • xs:nonPositiveInteger
  • xs:positiveInteger
  • xs:qname
  • xs:short
  • xs:string
  • xs:time
  • xs:token
  • xs:unsignedByte
  • xs:unsignedInt
  • xs:unsignedLong
  • xs:unsignedShort

Saat indeks XML selektif dibuat melalui dokumen yang memiliki skema yang terkait dengannya, menentukan jenis XQuery pada pembuatan indeks atau mengubah mengembalikan kesalahan. Pengguna dapat menggunakan anotasi jenis SQL di bagian promosi jalur. Jenis SQL harus berupa konversi yang valid dari jenis XSD yang ditentukan dalam skema, atau kesalahan dilemparkan. Semua jenis SQL yang memiliki representasi yang memadai dalam XSD didukung, dengan pengecualian jenis tanggal/waktu.

Catatan

Indeks selektif digunakan jika jenis yang ditentukan dalam promosi jalur Indeks XML Selektif sama value() dengan nilai pengembalian metode.

Petunjuk pengoptimalan berikut dapat digunakan dengan dokumen XML yang di ketik:

  • node() petunjuk pengoptimalan.

  • Petunjuk pengoptimalan MAXLENGTH dapat digunakan dengan jenis xs:string untuk mempersingkat nilai terindeks.

Untuk informasi selengkapnya tentang petunjuk pengoptimalan, lihat Menentukan Petunjuk Pengoptimalan.

Tentukan jalur

Indeks XML selektif memungkinkan Anda mengindeks hanya subkumpulan simpul dari data XML tersimpan yang relevan untuk kueri yang ingin Anda jalankan. Ketika subset simpul yang relevan jauh lebih kecil dari jumlah total simpul dalam dokumen XML, indeks XML selektif hanya menyimpan simpul yang relevan. Untuk mendapatkan manfaat dari indeks XML selektif, identifikasi subset simpul yang benar untuk diindeks.

Pilih simpul yang akan diindeks

Anda dapat menggunakan dua prinsip berikut untuk mengidentifikasi subset simpul yang benar untuk ditambahkan ke indeks XML selektif.

  1. Prinsip 1: Untuk mengevaluasi ekspresi XQuery tertentu, indeks semua simpul yang perlu Anda periksa.

    • Indeks semua simpul yang keberadaan atau nilainya digunakan dalam ekspresi XQuery.

    • Indeks semua simpul dalam ekspresi XQuery tempat predikat XQuery diterapkan.

    Pertimbangkan kueri berikut atas contoh dokumen XML dalam artikel ini:

    SELECT T.record FROM myXMLTable T
    WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;
    

    Untuk mengembalikan instans XML yang memenuhi kueri ini, indeks XML selektif perlu memeriksa dua simpul di setiap instans XML:

    • Node c, karena nilainya digunakan dalam ekspresi XQuery.

    • bSimpul , karena predikat diterapkan melalui simpulb dalam ekspresi XQuery.

  2. Prinsip 2: Untuk performa terbaik, indeks semua simpul yang diperlukan untuk mengevaluasi ekspresi XQuery tertentu. Jika Anda hanya mengindeks beberapa simpul, maka indeks XML selektif meningkatkan evaluasi subekspresi yang hanya menyertakan simpul terindeks.

Untuk meningkatkan performa pernyataan SELECT yang diperlihatkan di atas, Anda dapat membuat indeks XML selektif berikut:

CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
    path123 =  '/a/b',
    path124 =  '/a/b/c'
);

Jalur indeks yang identik

Anda tidak dapat mempromosikan jalur yang identik dengan jenis data yang sama di bawah nama jalur yang berbeda. Misalnya, kueri berikut menimbulkan kesalahan, karena pathOne dan pathTwo identik:

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'
);

Namun, Anda dapat mempromosikan jalur yang identik sebagai jenis data yang berbeda dengan nama yang berbeda. Misalnya, kueri berikut sekarang dapat diterima, karena tipe datanya berbeda:

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'
);

Contoh

Berikut adalah beberapa contoh lainnya untuk memilih simpul yang benar untuk diindeks untuk jenis XQuery yang berbeda.

Contoh 1

Berikut adalah XQuery sederhana yang menggunakan metode :exist()

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;

Tabel berikut ini memperlihatkan simpul yang harus diindeks untuk memungkinkan kueri ini menggunakan indeks XML selektif.

Simpul untuk disertakan dalam indeks Alasan untuk mengindeks simpul ini
/a/b/c/d/e/h Keberadaan simpul h dievaluasi dalam exist() metode .

Contoh 2

Berikut adalah variasi yang lebih kompleks dari XQuery sebelumnya, dengan predikat diterapkan:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;

Tabel berikut ini memperlihatkan simpul yang harus diindeks untuk memungkinkan kueri ini menggunakan indeks XML selektif.

Simpul untuk disertakan dalam indeks Alasan untuk mengindeks simpul ini
/a/b/c/d/e Predikat diterapkan di atas simpul e.
/a/b/c/d/e/f Nilai simpul f dievaluasi di dalam predikat.

Contoh 3

Berikut adalah kueri yang lebih kompleks dengan klausa value() :

SELECT T.record,
    T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;

Tabel berikut ini memperlihatkan simpul yang harus diindeks untuk memungkinkan kueri ini menggunakan indeks XML selektif.

Simpul untuk disertakan dalam indeks Alasan untuk mengindeks simpul ini
/a/b/c/d/e Predikat diterapkan di atas simpul e.
/a/b/c/d/e/f Nilai simpul f dievaluasi di dalam predikat.
/a/b/c/d/e/g Nilai simpul g dikembalikan oleh value() metode .

Contoh 4

Berikut adalah kueri yang menggunakan klausa FLWOR di dalam exist() klausa. (Nama FLWOR berasal dari lima klausul yang dapat membentuk ekspresi XQuery FLWOR: untuk, membiarkan, di mana, memesan berdasarkan, dan mengembalikan.)

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;

Tabel berikut ini memperlihatkan simpul yang harus diindeks untuk memungkinkan kueri ini menggunakan indeks XML selektif.

Simpul untuk disertakan dalam indeks Alasan untuk mengindeks simpul ini
/a/b/c/d/e Keberadaan simpul e dievaluasi dalam klausul FLWOR.
/a/b/c/d/e/f Nilai simpul f dievaluasi dalam klausul FLWOR.
/a/b/c/d/e/g Keberadaan simpul g dievaluasi oleh exist() metode .

Tentukan petunjuk pengoptimalan

Anda dapat menggunakan petunjuk pengoptimalan opsional untuk menentukan detail pemetaan tambahan untuk simpul yang diindeks oleh indeks XML selektif. Misalnya, Anda dapat menentukan jenis data dan kardinalitas simpul, dan informasi tertentu tentang struktur data. Informasi tambahan ini mendukung pemetaan yang lebih baik. Ini juga menghasilkan peningkatan performa atau penghematan dalam penyimpanan, atau keduanya.

Penggunaan petunjuk pengoptimalan bersifat opsional. Anda selalu dapat menerima pemetaan default, yang dapat diandalkan tetapi mungkin tidak memberikan performa dan penyimpanan yang optimal.

Beberapa petunjuk pengoptimalan, seperti petunjuk SINGLETON, memperkenalkan batasan atas data Anda. Dalam beberapa kasus, kesalahan dapat dimunculkan ketika batasan tersebut tidak terpenuhi.

Manfaat petunjuk pengoptimalan

Tabel berikut mengidentifikasi petunjuk pengoptimalan yang mendukung penyimpanan yang lebih efisien atau peningkatan performa.

Petunjuk pengoptimalan Penyimpanan yang lebih efisien Meningkatkan performa
node() Ya Tidak
SINGLETON Tidak Ya
JENIS DATA Ya Ya
MAXLENGTH Ya Ya

Petunjuk pengoptimalan dan jenis data

Anda dapat mengindeks simpul sebagai jenis data XQuery atau sebagai jenis data SQL Server. Tabel berikut menunjukkan petunjuk pengoptimalan mana yang didukung dengan setiap jenis data.

Petunjuk pengoptimalan Tipe data XQuery Jenis data SQL
node() Ya Tidak
SINGLETON Ya Ya
JENIS DATA Ya Tidak
MAXLENGTH Ya Tidak

petunjuk pengoptimalan node()

Berlaku untuk: Tipe data XQuery

Anda dapat menggunakan pengoptimalan node() untuk menentukan simpul yang nilainya tidak diperlukan untuk mengevaluasi kueri umum. Petunjuk ini mengurangi persyaratan penyimpanan ketika kueri umum hanya perlu mengevaluasi keberadaan simpul. (Secara default, indeks XML selektif menyimpan nilai untuk semua simpul yang dipromosikan, kecuali jenis simpul kompleks.)

Pertimbangkan contoh berikut:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;

Untuk menggunakan indeks XML selektif untuk mengevaluasi kueri ini, promosikan simpul b dan c. Namun, karena nilai simpul b tidak diperlukan, Anda dapat menggunakan node() petunjuk dengan sintaks berikut:

`/a/b/ as node()

Jika kueri memerlukan nilai simpul yang telah diindeks dengan node() petunjuk, maka indeks XML selektif tidak dapat digunakan.

Petunjuk pengoptimalan SINGLETON

Berlaku untuk: Tipe data XQuery atau SQL Server

Petunjuk pengoptimalan SINGLETON menentukan kardinalitas simpul. Petunjuk ini meningkatkan performa kueri karena diketahui sebelumnya bahwa simpul muncul paling banyak satu kali dalam induk atau leluhurnya.

Pertimbangkan contoh dokumen XML dalam artikel ini.

Untuk menggunakan indeks XML selektif untuk mengkueri dokumen ini, Anda dapat menentukan petunjuk SINGLETON untuk simpul d karena muncul paling lama satu kali dalam induknya.

Jika petunjuk SINGLETON telah ditentukan, tetapi simpul muncul lebih dari satu kali dalam induk atau leluhurnya, maka kesalahan dimunculkan saat Anda membuat indeks (untuk data yang ada) atau saat Anda menjalankan kueri (untuk data baru).

Petunjuk pengoptimalan TIPE DATA

Berlaku untuk: Tipe data XQuery

Petunjuk pengoptimalan JENIS DATA memungkinkan Anda menentukan jenis data XQuery atau SQL Server untuk simpul terindeks. Jenis data digunakan untuk kolom dalam tabel data indeks XML selektif yang sesuai dengan simpul terindeks.

Saat transmisi nilai yang ada ke jenis data yang ditentukan gagal, operasi sisipkan (ke dalam indeks) tidak gagal; namun, nilai null dimasukkan ke dalam tabel data indeks.

Petunjuk pengoptimalan MAXLENGTH

Berlaku untuk: Tipe data XQuery

Petunjuk pengoptimalan MAXLENGTH memungkinkan Anda membatasi panjang data xs:string. MAXLENGTH tidak relevan untuk jenis data SQL Server karena Anda menentukan panjang saat Anda menentukan jenis tanggal VARCHAR atau NVARCHAR.

Ketika string yang ada lebih panjang dari MAXLENGTH yang ditentukan, maka memasukkan nilai tersebut ke dalam indeks gagal.

Contoh dokumen XML untuk contoh

Contoh dokumen XML berikut direferensikan dalam contoh dalam artikel ini:

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

Lihat juga