Bagikan melalui


Indeks XML (SQL Server)

Indeks XML dapat dibuat pada xml kolom tipe data. Mereka mengindeks semua tag, nilai, dan jalur dalam instans XML di kolom dan meningkatkan performa kueri. Aplikasi Anda mungkin mendapat manfaat dari indeks XML dalam situasi berikut:

  • Kueri pada kolom XML sering muncul dalam beban kerja Anda sehari-hari. Biaya pemeliharaan indeks XML selama modifikasi data harus dipertimbangkan.

  • Nilai XML Anda relatif besar dan bagian yang diambil relatif kecil. Membangun indeks menghindari penguraian seluruh data pada waktu dijalankan dan mendukung pencarian indeks untuk pemrosesan kueri yang efisien.

Indeks XML termasuk dalam kategori berikut:

  • Indeks XML utama

  • Indeks XML sekunder

Indeks pertama pada xml kolom jenis harus merupakan indeks XML utama. Menggunakan indeks XML utama, jenis indeks sekunder berikut didukung: PATH, VALUE, dan PROPERTY. Bergantung pada jenis kueri, indeks sekunder ini mungkin membantu meningkatkan performa kueri.

Nota

Anda tidak dapat membuat atau mengubah indeks XML kecuali opsi database diatur dengan benar untuk bekerja dengan xml tipe data. Untuk informasi selengkapnya, lihat Menggunakan Pencarian Full-Text dengan Kolom XML.

Instans XML disimpan dalam xml kolom jenis sebagai objek biner besar (BLOB). Instans XML ini dapat berukuran besar, dan representasi xml biner instans jenis data yang disimpan dapat mencapai 2 GB. Tanpa indeks, objek besar biner ini dipecah saat waktu berjalan untuk mengevaluasi kueri. Proses penghancuran ini bisa memakan waktu. Misalnya, pertimbangkan kueri di bawah ini:

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  

Untuk memilih instans XML yang memenuhi kondisi dalam WHERE klausa, objek besar biner XML (BLOB) di setiap baris tabel Production.ProductModel dihancurkan pada waktu proses. Kemudian, ekspresi (/PD:ProductDescription/@ProductModelID[.="19"] dalam metode exist() dievaluasi. Penghancuran run-time ini bisa mahal, tergantung pada ukuran dan jumlah instans yang disimpan di kolom.

Jika mengkueri objek besar biner XML (BLOB) umum di lingkungan aplikasi Anda, maka sangat membantu untuk mengindeks kolom jenis xml. Namun, ada biaya yang terkait dengan mempertahankan indeks selama modifikasi data.

Indeks XML Utama

Indeks XML utama mengindeks semua tag, nilai, dan jalur dalam instans XML di kolom XML. Untuk membuat indeks XML utama, tabel tempat kolom XML terjadi harus memiliki indeks berkluster pada kunci utama tabel. SQL Server menggunakan kunci utama ini untuk menghubungkan baris dalam indeks XML utama dengan baris dalam tabel yang berisi kolom XML.

Indeks XML utama adalah representasi BLOB XML yang dihancurkan dan dipertahankan di xml kolom tipe data. Untuk setiap objek besar biner XML (BLOB) di kolom, indeks membuat beberapa baris data. Jumlah baris dalam indeks kira-kira sama dengan jumlah simpul dalam objek besar biner XML. Saat kueri mengambil instans XML lengkap, SQL Server menyediakan instans dari kolom XML. Kueri dalam instans XML menggunakan indeks XML utama, dan dapat mengembalikan nilai skalar atau subtrees XML dengan menggunakan indeks itu sendiri.

Setiap baris menyimpan informasi node berikut:

  • Nama tag seperti elemen atau nama atribut.

  • Nilai simpul.

  • Jenis node seperti node elemen, node atribut, atau node teks.

  • Informasi mengenai urutan dokumen, yang diwakili oleh penanda simpul internal.

  • Jalur dari setiap simpul ke akar pohon XML. Kolom ini dicari untuk ekspresi jalur dalam kueri.

  • Kunci utama tabel dasar. Kunci utama tabel dasar diduplikasi dalam indeks XML utama untuk gabungan kembali dengan tabel dasar, dan jumlah kolom maksimum dalam kunci utama tabel dasar dibatasi hingga 15.

Informasi simpul ini digunakan untuk mengevaluasi dan membuat hasil XML untuk kueri tertentu. Untuk tujuan pengoptimalan, nama tag dan informasi jenis node dikodekan sebagai nilai bilangan bulat, dan kolom Jalur menggunakan pengodean yang sama. Selain itu, jalur disimpan dalam urutan terbalik untuk memungkinkan jalur yang cocok ketika hanya akhiran jalur yang diketahui. Contohnya:

  • //ContactRecord/PhoneNumber di mana hanya dua langkah terakhir yang diketahui

ATAU

  • /Book/*/Title yang karakter pengganti (*) ditentukan di tengah ekspresi.

Prosesor kueri menggunakan indeks XML utama untuk kueri yang melibatkan Metode Tipe Data xml dan mengembalikan nilai skalar atau subtrees XML dari indeks utama itu sendiri. (Indeks ini menyimpan semua informasi yang diperlukan untuk membangun kembali instans XML.)

Misalnya, kueri berikut mengembalikan informasi ringkasan yang disimpan dalam kolom tipe CatalogDescription``xml di tabel ProductModel. Kueri mengembalikan <Summary> informasi hanya untuk model produk di mana deskripsi katalognya juga menyimpan deskripsi <Features>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")SELECT CatalogDescription.query('  /PD:ProductDescription/PD:Summary') as ResultFROM Production.ProductModelWHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1  

Sehubungan dengan indeks XML utama, alih-alih menghancurkan setiap instans objek besar biner XML dalam tabel dasar, baris dalam indeks yang sesuai dengan setiap objek besar biner XML dicari secara berurutan untuk ekspresi yang ditentukan dalam exist() metode . Jika jalur ditemukan di kolom Jalur dalam indeks, elemen <Summary> bersama dengan sub-pohonnya diambil dari indeks XML utama dan dikonversi menjadi objek biner besar XML sebagai hasil metode query().

Perhatikan bahwa indeks XML utama tidak digunakan saat mengambil instans XML lengkap. Misalnya, kueri berikut mengambil dari tabel seluruh instans XML yang menjelaskan instruksi manufaktur untuk model produk tertentu.

USE AdventureWorks2012;SELECT InstructionsFROM Production.ProductModel WHERE ProductModelID=7;  

Indeks XML Sekunder

Untuk meningkatkan performa pencarian, Anda dapat membuat indeks XML sekunder. Indeks XML utama harus terlebih dahulu ada sebelum Anda dapat membuat indeks sekunder. Ini adalah jenisnya:

  • Indeks XML sekunder PATH

  • NILAI indeks XML sekunder

  • Indeks XML sekunder PROPERTI

Berikut adalah beberapa panduan untuk membuat satu atau beberapa indeks sekunder:

  • Jika beban kerja Anda menggunakan ekspresi jalur secara signifikan pada kolom XML, indeks XML sekunder PATH kemungkinan akan mempercepat beban kerja Anda. Kasus yang paling umum adalah penggunaan metode exist() pada kolom XML dalam klausul WHERE Transact-SQL.

  • Jika beban kerja Anda mengambil beberapa nilai dari instans XML individual dengan menggunakan ekspresi jalur, jalur pengklusteran dalam setiap instans XML dalam indeks PROPERTI mungkin berguna. Skenario ini biasanya terjadi dalam skenario tas properti ketika properti objek diambil dan nilai kunci utamanya diketahui.

  • Jika beban kerja Anda melibatkan kueri untuk nilai dalam instans XML tanpa mengetahui elemen atau nama atribut yang berisi nilai tersebut, Anda mungkin ingin membuat indeks VALUE. Ini biasanya terjadi dengan pencarian sumbu turunan, seperti //author[last-name="Howard"], di mana <elemen penulis> dapat terjadi pada tingkat hierarki apa pun. Ini juga terjadi dalam kueri wildcard, seperti /book [@* = "novel"], di mana kueri mencari <elemen buku> yang memiliki beberapa atribut yang memiliki nilai "novel".

Indeks Sekunder XML PATH

Jika kueri Anda umumnya menentukan ekspresi jalur pada xml kolom jenis, indeks sekunder PATH mungkin dapat mempercepat pencarian. Seperti yang dijelaskan sebelumnya dalam topik ini, indeks utama sangat membantu ketika Anda memiliki kueri yang menentukan metode exist() dalam klausa WHERE. Jika Anda menambahkan indeks sekunder PATH, Anda juga dapat meningkatkan performa pencarian dalam kueri tersebut.

Meskipun indeks XML utama menghindari harus menghancurkan objek besar biner XML pada waktu proses, indeks mungkin tidak memberikan performa terbaik untuk kueri berdasarkan ekspresi jalur. Karena semua baris dalam indeks XML utama yang sesuai dengan objek besar biner XML dicari secara berurutan untuk instans XML besar, pencarian berurutan mungkin lambat. Dalam hal ini, memiliki indeks sekunder yang dibangun pada nilai jalur dan nilai simpul dalam indeks utama dapat mempercepat pencarian indeks secara signifikan. Dalam indeks sekunder PATH, nilai jalur dan simpul adalah kolom kunci yang memungkinkan pencarian yang lebih efisien saat mencari jalur. Pengoptimal kueri dapat menggunakan indeks PATH untuk ekspresi seperti yang diperlihatkan dalam hal berikut:

  • /root/Location yang hanya menentukan jalur

ATAU

  • /root/Location/@LocationID[.="10"] di mana jalur dan nilai simpul ditentukan.

Kueri berikut ini memperlihatkan di mana indeks PATH berguna:

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  

Dalam kueri, ekspresi /PD:ProductDescription/@ProductModelID jalur dan nilai "19" dalam exist() metode sesuai dengan bidang kunci indeks PATH. Ini memungkinkan pencarian langsung dalam indeks PATH dan memberikan performa pencarian yang lebih baik daripada pencarian berurutan untuk nilai jalur dalam indeks utama.

Indeks XML Sekunder NILAI

Jika kueri berbasis nilai, misalnya, /Root/ProductDescription/@*[. = "Mountain Bike"] atau //ProductDescription[@Name = "Mountain Bike"], dan jalur tidak sepenuhnya ditentukan atau menyertakan kartubebas, Anda mungkin mendapatkan hasil yang lebih cepat dengan membangun indeks XML sekunder yang dibangun berdasarkan nilai simpul dalam indeks XML utama.

Kolom kunci indeks VALUE adalah (nilai dan jalur simpul) dari indeks XML utama. Jika beban kerja Anda melibatkan kueri nilai dari instans XML tanpa mengetahui elemen atau nama atribut yang berisi nilai, indeks VALUE mungkin berguna. Misalnya, ekspresi berikut akan mendapat manfaat dari memiliki indeks VALUE:

  • //author[LastName="someName"] di mana Anda mengetahui nilai elemen <LastName>, tetapi <author> induk dapat terjadi di mana saja.

  • /book[@* = "someValue"]di mana kueri mencari <book> elemen yang memiliki beberapa atribut yang memiliki nilai ."someValue"

Kueri berikut mengembalikan ContactID dari Contact tabel. Klausa WHERE menentukan filter yang mencari nilai di AdditionalContactInfo``xml kolom jenis. ID kontak dikembalikan hanya jika informasi kontak tambahan yang sesuai objek besar biner XML menyertakan nomor telepon tertentu. Karena elemen <telephoneNumber> mungkin muncul di mana saja dalam XML, ekspresi jalur menentukan poros descendant-or-self.

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  

Dalam situasi ini, nilai pencarian untuk <number> diketahui, tetapi dapat muncul di mana saja dalam instans XML sebagai anak dari <telephoneNumber> elemen . Kueri semacam ini mungkin mendapat manfaat dari pencarian indeks berdasarkan nilai tertentu.

Indeks Sekunder PROPERTI

Kueri yang mengambil satu atau beberapa nilai dari masing-masing instans XML mungkin mendapat manfaat dari indeks PROPERTI. Skenario ini terjadi ketika Anda mengambil properti objek dengan menggunakan metode value() jenis xml dan kapan nilai kunci utama objek diketahui.

Indeks PROPERTI dibangun pada kolom (PK, Jalur, dan nilai simpul) dari indeks XML utama di mana PK adalah kunci utama tabel dasar.

Misalnya, untuk model 19 produk, kueri berikut mengambil nilai atribut ProductModelID dan ProductModelName menggunakan metode value(). Alih-alih menggunakan indeks XML utama atau indeks XML sekunder lainnya, indeks PROPERTI dapat memberikan eksekusi yang lebih cepat.

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  

Kecuali untuk perbedaan yang dijelaskan nanti dalam topik ini, membuat indeks XML padaxml kolom jenis mirip dengan membuat indeks pada kolom non-jenisxml . Pernyataan DDL Transact-SQL berikut dapat digunakan untuk membuat dan mengelola indeks XML:

Mendapatkan Informasi tentang Indeks XML

Entri indeks XML muncul dalam tampilan katalog, sys.indexes, dengan indeks "type" 3. Kolom nama berisi nama indeks XML.

Indeks XML juga dicatat dalam tampilan katalog, sys.xml_indexes. Ini berisi semua kolom sys.indexes dan beberapa kolom tertentu yang berguna untuk indeks XML. Nilai NULL di kolom, secondary_type, menunjukkan indeks XML utama; nilai 'P', 'R' dan 'V' masing-masing merupakan singkatan dari indeks XML sekunder PATH, PROPERTY, dan VALUE.

Penggunaan ruang indeks XML dapat ditemukan dalam fungsi bernilai tabel sys.dm_db_index_physical_stats. Ini menyediakan informasi, seperti jumlah halaman disk yang ditempati, ukuran baris rata-rata dalam byte, dan jumlah rekaman, untuk semua jenis indeks.. Ini juga termasuk indeks XML. Informasi ini tersedia untuk setiap partisi database. Indeks XML menggunakan skema partisi dan fungsi partisi yang sama dari tabel dasar.

Lihat Juga

sys.dm_db_index_physical_stats (T-SQL)
XML Data (SQL Server)