Hiện tại tôi đang cố gắng tìm hiểu cách SQL Server đánh giá mức độ chính xác của các biến vị ngữ phạm vi bao trùm một phần bước biểu đồ.
Trên Internet, tại ước tính số liệu thống kê tim mạch cho giá trị thống kê từng bước tôi đã bắt gặp một câu hỏi tương tự và Paul White đã đưa ra một câu trả lời khá thú vị cho nó.
Theo câu trả lời của Paul, các công thức để ước tính cardinality cho các vị từ> = và> (trong trường hợp này, tôi chỉ quan tâm đến mô hình ước tính Cardinality ít nhất 120) như sau:
Dành cho>
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
Dành cho> =:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
Tôi đã thử nghiệm việc áp dụng các công thức trên [sản xuất]. [TransactionHistory] bảng của AdventureWorks2014 cơ sở dữ liệu dựa trên vị phạm vi sử dụng TransactionDate cột và datetime phạm vi giữa '20.140.614' và '20.140.618'.
Số liệu thống kê cho bước biểu đồ của phạm vi này như sau:
Theo công thức, tôi đã tính số lượng thẻ cho truy vấn sau:
SELECT COUNT(1)
FROM [AdventureWorks2014].[Production].[TransactionHistory]
WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000'
Việc tính toán được thực hiện bằng mã sau:
DECLARE @predStart DATETIME = '20140615 00:00:00.000'
DECLARE @predEnd DATETIME = '20140616 00:00:00.000'
DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
DECLARE @stepEnd DATETIME = '20140618 00:00:00.000'
DECLARE @predRange FLOAT = DATEDIFF(ms, @predStart, @predEnd)
DECLARE @stepRange FLOAT = DATEDIFF(ms, @stepStart, @stepEnd)
DECLARE @F FLOAT = @predRange / @stepRange;
DECLARE @avg_range_rows FLOAT = 100.3333
DECLARE @distinct_range_rows INT = 3
DECLARE @EQ_ROWS INT = 0
SELECT @F AS 'F'
--for new cardinality estimator
SELECT @EQ_ROWS + @avg_range_rows * (@F * (@distinct_range_rows - 1) + 1) AS [new_card]
Sau khi tính toán, tôi nhận được kết quả như sau:
Theo công thức, hóa ra 150,5, nhưng trình tối ưu hóa ước tính vị từ ở mức 225,75 hàng và nếu bạn thay đổi đường viền trên của vị từ thành '20140617', trình tối ưu hóa sẽ đánh giá 250.833 hàng, trong khi sử dụng công thức chúng tôi chỉ nhận được 200.6666 hàng.
Xin vui lòng cho tôi biết, Công cụ ước tính Cardinality đánh giá như thế nào trong trường hợp này, có thể tôi đã mắc lỗi ở đâu đó trong sự hiểu biết của tôi về các công thức được trích dẫn?