Tips untuk Mengoptimalkan XML di SQL Server – Saya telah mengerjakan proyek yang banyak menggunakan XML di dalam SQL Server. Kami benar-benar memanfaatkan dukungan XML SQL Server hampir sepenuhnya, tetapi dengan beberapa dampak.
Tips untuk Mengopti malkan XML di SQL Server
zorba-xquery – Saat kami melakukan pengujian beban, kinerja menurun dan kami harus mundur dan menyesuaikan cara kami menggunakan data XML kami.
Baca Juga : Mengembangkan Sistem Kueri Yang Efisien Untuk Dokumen XML
Jika Anda menggunakan XML dalam database Anda, Anda mungkin ingin mempertimbangkan beberapa tips ini untuk mengoptimalkan keseluruhan kueri dan kinerja yang terkait dengan data XML Anda.
1. Promosikan elemen dan atribut yang sering digunakan ke dalam kolom relasional
Jika Anda mendapati diri Anda selalu menarik nilai skalar dari kolom XML Anda untuk bergabung ke tabel lain, Anda harus mempertimbangkan untuk “mempromosikan” nilai ini ke dalam kolom.
- Pro: Nilai ini sekarang dapat diindeks, sehingga dapat meningkatkan kinerja kueri Anda.
- Con: Ini adalah overhead manajemen tambahan. Jika Anda perlu mengubah nilai dalam dokumen XML, Anda juga perlu mengubah nilai di kolom relasional Anda. Anda dapat mempertimbangkan untuk melakukan ini di tingkat aplikasi (yaitu mengubah nilai di kedua tempat sekaligus), atau membuat kolom kalkulasi tetap yang menggunakan UDF yang mengekstrak nilai skalar untuk Anda, atau bahkan memicu (hati-hati! pastikan Anda menguji sebelum Anda menerapkan dalam produksi).
2. Tambahkan skema ke kolom XML Anda
XML sebenarnya hanyalah sebuah dokumen teks. Ini menimbulkan overhead ke SQL Server karena setiap kali Anda melakukan operasi, SQL Server perlu “menebak” tipe data mana yang mungkin sesuai untuk operasi Anda sebelum melakukan konversi implisit. Anda dapat menghilangkan langkah ini dengan membuat kolom XML yang diketik, atau XML yang terikat ke skema (XSD).
- Pro: Memproses XML Anda akan lebih cepat daripada jika Anda menggunakan XML yang tidak diketik. Ini menghilangkan pekerjaan tebakan tipe data dari SQL Server.
- Con: Ini dapat membuat overhead manajemen. XML Anda sekarang tiba-tiba menjadi tidak fleksibel lagi. Setiap kali Anda perlu menambahkan elemen atau atribut baru atau fragmen bersarang baru, Anda harus MENGUBAH skema terlebih dahulu sebelum Anda dapat membuat perubahan. Perubahan ini mungkin perlu diturunkan ke semua prosedur tersimpan Anda yang menggunakan kolom ini.
3. Gunakan Indeks XML
Anda harus terlebih dahulu membuat indeks XML Primer, kemudian membuat indeks sekunder.
Contoh indeks XML utama
BUAT INDEKS XML UTAMA invoiceidx
AKTIF [Penjualan].[salesxml](xmlcontent)
PERGILAH
Ada 3 indeks XML sekunder utama:
PATH Sekunder XML Indeks berguna jika Anda menggunakan jalur, dan jika Anda tidak memiliki wildcard
PILIH
xmlcontent.value(‘(penjualan/pesanan[@ord_num=”6871″])[1]’, ‘varchar(20)’) ,
kolom lainnya
DARI
[Penjualan].[salesxml]
DI MANA
xmlcontent.exist(‘(penjualan/pesanan[@ord_num=”6871″])’) =1
PROPERTI Indeks XML Sekunder berguna jika mencari beberapa properti, tetapi mungkin tidak memiliki path lengkap
Sampel
PILIH
kolom lainnya
DARI
[Penjualan].[salesxml]
DI MANA
xmlcontent.exist(‘(//title_id)’) = 1
VALUE Indeks XML Sekunder berguna jika Anda mengetahui nilai pasti yang dicari, tetapi mungkin tidak memiliki jalur lengkap
PILIH
kolom lainnya
DARI
[Penjualan].[salesxml]
DI MANA
xmlcontent.exist(‘/sales/order[@ord_num=”6871″]/text()[. = “Sesuatu”]’) = 1
PILIH
kolom lainnya
DARI
[Penjualan].[salesxml]
DI MANA
xmlcontent.exist(‘(//title_id/@*[. = “khusus”])’) = 1
- Pro: Seperti halnya indeks biasa, pencarian lebih cepat.
- Con: Seperti halnya indeks biasa, menempati lebih banyak penyimpanan, dan membutuhkan lebih banyak sumber daya yang diperlukan untuk memproses ulang indeks Anda.
4. Membuat ulang XML pada Pembaruan Massal
Pernah ingin memperbarui properti elemen atau atribut secara massal di XML Anda? Tergoda untuk menggunakan dukungan SQL Server untuk XQuery? Sayangnya dalam kasus saya, untuk beberapa pembaruan yang perlu saya lakukan, XQuery tidak memotongnya.
Metode .modify() kolom atau variabel XML Anda terbatas hanya untuk memperbarui instance XML tersebut. Jika Anda ingin menggunakan XQuery .modify() untuk memperbarui lebih dari satu item, Anda harus mengulang semua instance XML dan memanggil .modify() untuk masing-masing item.
Alternatif yang mungkin, tergantung pada seberapa besar data XML Anda, adalah membuat ulang XML. Jika data yang Anda perlukan untuk XML sudah ada di kolom lain yang ada, Anda bisa melakukan kueri dengan FOR XML PATH dan menyertakan nilai baru. Gunakan dengan hati-hati. Ini berhasil untuk tujuan saya, jarak tempuh Anda mungkin berbeda.
- Pro: Bisa lebih cepat. YMMV.
- Con: Ini membutuhkan sedikit lebih banyak pengkodean, dan merakit ulang XML Anda.