Sự khác biệt so với hàng thực tế (thực tế nhỏ hơn nhiều so với ước tính) - sắp xếp


8

Tôi đang chạy một truy vấn đang xử lý một số nút trong tài liệu XML. Chi phí cây con ước tính của tôi là hàng triệu và có vẻ như tất cả đều đến từ một máy chủ sql hoạt động sắp xếp đang thực hiện trên một số dữ liệu mà tôi trích xuất từ ​​các cột xml qua XPath. Hoạt động Sắp xếp có số lượng hàng ước tính vào khoảng 19 triệu, trong khi số lượng hàng thực tế là khoảng 800. Bản thân truy vấn chạy khá tốt (1 - 2 giây), nhưng sự khác biệt khiến tôi băn khoăn về hiệu suất truy vấn và tại sao điều này sự khác biệt quá lớn?


2
Điều này có thể là do các số liệu thống kê lỗi thời, nhưng thực sự không thể biết được nếu không có thêm thông tin (bao gồm cấu trúc / chỉ mục bảng, truy vấn và kế hoạch thực hiện - không ước tính - thực tế).
Aaron Bertrand

1
Từ kinh nghiệm của tôi, các kế hoạch truy vấn liên quan đến việc băm nhỏ XML luôn có ước tính chi phí tăng cao. Giống như, đến mức nếu truy vấn thực hiện tốt về thời gian thực hiện, tôi chỉ cần bỏ qua các con số ước tính chi phí. Tôi không biết tại sao nó lại làm như vậy, nhưng nó có thể có một cái gì đó để làm mà không biết bao nhiêu XML sẽ được sử dụng làm đầu vào. Tuy nhiên, nếu mục tiêu của bạn là cải thiện hiệu năng của truy vấn, một cách tôi đã tìm thấy là sử dụng các bộ sưu tập lược đồ XML, như tôi đã viết ở đây .
Jon Seigel

Câu trả lời:


9

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

nhập mô tả hình ảnh ở đây

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 đó rootthự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ề.

nhập mô tả hình ảnh ở đây

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.