Tidak ada statistik yang dihasilkan pada kolom XML. Taksiran ditebak berdasarkan ekspresi yang digunakan saat menanyakan XML.
Menggunakan tabel ini:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
Dan permintaan XML ini agak sederhana:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Akan memberi Anda satu baris yang dikembalikan tetapi perkiraan baris yang dikembalikan adalah 200. Itu akan menjadi 200 terlepas dari apa XML atau berapa banyak XML yang Anda masukkan ke dalam kolom XML untuk satu baris itu.
Ini adalah paket kueri dengan perkiraan jumlah baris ditampilkan.
Cara untuk meningkatkan, atau setidaknya mengubah, perkiraan adalah memberikan pengoptimal permintaan informasi lebih lanjut tentang XML. Dalam hal ini, karena saya tahu itu root
benar - benar merupakan simpul root dalam XML, saya dapat menulis ulang kueri seperti ini.
select X2.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root[1]') as X1(N)
cross apply X1.N.nodes('item') X2(N)
Itu akan memberi saya perkiraan 5 baris yang dikembalikan.
Penulisan ulang kueri mungkin tidak akan mempercepat penghancuran XML tetapi jika perkiraan lebih baik, kemungkinan pengoptimal kueri dapat membuat keputusan yang lebih cerdas untuk sisa kueri.
Saya belum menemukan dokumentasi tentang apa aturannya untuk perkiraan selain presentasi oleh Michael Rys di mana ia berkata:
Perkiraan kardinalitas dasar selalu 10'000 baris!
Beberapa penyesuaian berdasarkan filter jalur yang didorong