Ước tính công viên của các vị từ phạm vi bao phủ một phần


13

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:

Biểu đồ

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:

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

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?


Sql server 2014 12.0.5 SP2
Павел Ковалёв

Câu trả lời:


12

SQL Server sử dụng các tính toán khác nhau trong các tình huống khác nhau. Ví dụ của bạn khác với Hỏi & Đáp được liên kết vì phạm vi của bạn hoàn toàn được chứa trong một bước; nó không vượt qua một ranh giới bước. Nó cũng là một khoảng với hai đầu chứ không phải một. Viết BETWEENgiống như viết hai vị ngữ riêng biệt với >=<=.

Khoảng thời gian với hai ranh giới, trong một bước duy nhất

Công thức được sửa đổi để thực hiện phép nội suy tuyến tính trong bước cho số lượng giá trị riêng biệt dự kiến ​​và phản ánh rằng hai điểm cuối phạm vi hiện được chỉ định (và được giả sử tồn tại trong bước biểu đồ) chứ không phải một.

Sử dụng các bước biểu đồ được đưa ra trong câu hỏi:

các bước biểu đồ câu hỏi

Đối với truy vấn với BETWEEN '20140615' AND '20140616', phép tính là:

DECLARE
    @Q1 float = CONVERT(float, CONVERT(datetime, '2014-06-15')),
    @Q2 float = CONVERT(float, CONVERT(datetime, '2014-06-16')),
    @K1 float = CONVERT(float, CONVERT(datetime, '2014-06-14')),
    @K2 float = CONVERT(float, CONVERT(datetime, '2014-06-18')),
    @RANGE_ROWS float = 301,
    @DISTINCT_RANGE_ROWS float = 3;

DECLARE
    @S1 float = (@Q1 - @K1) / (@K2 - @K1),
    @S2 float = (@Q2 - @K1) / (@K2 - @K1);

DECLARE
    @F float = @S2 - @S1;

DECLARE
    @AVG_RANGE_ROWS float = @RANGE_ROWS / @DISTINCT_RANGE_ROWS;

SELECT
    @AVG_RANGE_ROWS * ((@F * (@DISTINCT_RANGE_ROWS - 2)) + 2);

... tặng 225,75 . Thay đổi @Q2từ '20140616'thành '20140617'cho kết quả 250.833 .

Cả hai kết quả phù hợp với những gì được đưa ra trong câu hỏi.

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.