Có phải Số lượng ước tính của hàng Rows luôn luôn được thực hiện trong các kế hoạch thực hiện SSMS không?


7

Khi tôi xem xét các kế hoạch thực hiện, tôi thường so sánh "Số lượng hàng ước tính" với "Số lượng hàng thực tế", tìm kiếm sự khác biệt. Ví dụ, khi tôi di chuột qua mũi tên dưới cùng trong hình bên dưới, ước tính là 1 và thực tế là 200, vì vậy trong nháy mắt, nó dường như là một ước tính khủng khiếp.

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

Tuy nhiên, tôi đã tự hỏi liệu đây có thực sự là ước tính cho chỉ một lần thực hiện hay không. Khi tôi di chuột qua tìm kiếm để có thêm thông tin chi tiết, tôi thấy rằng có 200 vụ hành quyết và ước tính 199,98. Vì vậy, nếu linh cảm của tôi là chính xác, ước tính thực sự đã chết.

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

Bất cứ ai có thể xác nhận cho tôi nếu đây là trường hợp? Và nếu vậy, tôi có phải là người duy nhất nghĩ rằng điều này là vô cùng sai lệch (đặc biệt là khi di chuột qua các mũi tên)? Nếu nó giúp, đây là kịch bản để thiết lập và tái tạo kế hoạch trên:

-- Setup: Create 2 tables with 100K rows each.

CREATE TABLE T1(Id int NOT NULL PRIMARY KEY, X INT NOT NULL) 
CREATE TABLE T2(Id int NOT NULL PRIMARY KEY) 
CREATE INDEX Ix ON T1 (X, Id)

;WITH  
    Pass0 AS (SELECT 1 AS C UNION ALL SELECT 1), --2 rows  
    Pass1 AS (SELECT 1 AS C FROM Pass0 AS A, Pass0 AS B),--4 rows  
    Pass2 AS (SELECT 1 AS C FROM Pass1 AS A ,Pass1 AS B),--16 rows 
    Pass3 AS (SELECT 1 AS C FROM Pass2 AS A ,Pass2 AS B),--256 rows 
    Pass4 AS (SELECT 1 AS C FROM Pass3 AS A ,Pass3 AS B),--65536 rows 
    Pass5 AS (SELECT 1 AS C FROM Pass4 AS A ,Pass2 AS B),--1048576 rows 
    Tally AS (SELECT  ROW_NUMBER() OVER (ORDER BY C) AS Number FROM   Pass5)
INSERT INTO T1
SELECT Number, Number
FROM  Tally
WHERE Number <= 100000

INSERT INTO T2
SELECT Id
FROM T1

--Now join them

SELECT *
FROM T1
JOIN T2 ON T2.Id = T1.Id
WHERE T1.X <= 200

Câu trả lời:


7

Vâng, đây là trường hợp - SSMS không phải lúc nào cũng hiển thị cho bạn các hàng ước tính * số lần thực hiện và điều này rõ ràng có thể dẫn đến một số giả định không chính xác nếu bạn không đào sâu như bạn đã làm. Nhưng về mặt kỹ thuật, câu trả lời cho câu hỏi của bạn là không. Đôi khi SSMS sẽ có được ước tính này đúng, tùy thuộc vào nhà điều hành và các ngữ nghĩa khác.

Trong SentryOne Plan Explorer, chúng tôi cố gắng bù đắp cho điều này bằng cách hiển thị số hàng * số lần thực thi của SQL Server trong một số trường hợp thay vì chỉ sao chép một cách mù quáng số lượng hàng từ XML của kế hoạch. Kế hoạch của bạn, ví dụ:

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


1
Cảm ơn Aaron! Có vẻ như SSMS đã làm rất tốt việc che khuất thực tế đó ... Tôi thích cách SQL Sentry triển khai nó tốt hơn nhiều. Tôi cũng tò mò về cách nó thậm chí có được ước tính 1 hàng cho mỗi lần thực hiện? Nó có vẻ giống như một giả định hơn là dựa trên số liệu thống kê. Bất kỳ ý tưởng?
JohnnyM

@JohnnyM Tôi nghĩ nó giống như nó giả định một lần thực thi cho toán tử, trái ngược với một lần thực thi trên mỗi hàng cho toán tử.
Aaron Bertrand

Không chắc là tôi hiểu. Chỉ cần làm rõ, khi SSMS nói "Số lượng hàng ước tính = 1" thì nó lấy số 1 từ đâu?
JohnnyM

Tôi nghĩ bạn đã đúng, rằng đây chỉ là một giả định kém, không dựa trên số liệu thống kê thực tế. Và nó không tính đến thực tế là nó sẽ lặp lại cho mỗi hàng, không chỉ cho một hàng.
Aaron Bertrand

0

Có vẻ như đây là một tính năng của Vòng lặp lồng nhau, trong đó Hàng ước tính dường như là giá trị cho mỗi lần thực hiện trong vòng lặp lồng nhau:

ước tính hàng-thực tế-hàng-và-thực hiện-đếm

Cụ thể hơn:

Bạn chỉ cần lưu ý rằng các hàng ước tính là trên mỗi lần thực hiện và các hàng thực tế là tổng số cho tất cả các lần thực hiện, vì vậy hãy chắc chắn rằng bạn đang so sánh cam với cam, không phải cam với các lát cam.

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.