Không có số liệu thống kê được tạo trên các cột XML. Các ước tính được đoán dựa trên các biểu thức được sử dụng khi truy vấn XML.
Sử dụng bảng này:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
Và truy vấn XML khá đơn giản này:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Sẽ trả lại cho bạn một hàng nhưng các hàng ước tính được trả về là 200. Nó sẽ là 200 bất kể XML hay bao nhiêu XML bạn nhét vào cột XML cho một hàng đó.
Đây là kế hoạch truy vấn với số lượng hàng ước tính được hiển thị.
Một cách để cải thiện hoặc ít nhất là thay đổi, các ước tính là cung cấp cho trình tối ưu hóa truy vấn một số thông tin thêm về XML. Trong trường hợp này, vì tôi biết rằng đó root
thực sự là một nút gốc trong XML, tôi có thể viết lại truy vấn như thế này.
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)
Điều đó sẽ cho tôi một ước tính của 5 hàng trả về.
Việc viết lại truy vấn có thể sẽ không tăng tốc độ băm nhỏ của XML nhưng nếu ước tính tốt hơn, rất có thể trình tối ưu hóa truy vấn có thể đưa ra quyết định thông minh hơn cho phần còn lại của truy vấn.
Tôi chưa tìm thấy bất kỳ tài liệu nào về các quy tắc dành cho các ước tính ngoài mục trình bày của Michael Rys nơi anh nói:
Ước tính cardinality cơ sở luôn là 10.000 hàng!
Một số điều chỉnh dựa trên các bộ lọc đường dẫn đẩy