Quando olho para os planos de execução, geralmente comparo "Número estimado de linhas" com "Número real de linhas", procurando discrepâncias. Por exemplo, quando passo o mouse sobre a seta inferior na figura abaixo, a estimativa é 1 e a real é 200, portanto, à primeira vista, parece ser uma estimativa terrível.
No entanto, comecei a me perguntar se essa é realmente a estimativa para apenas uma execução. Quando passo o mouse sobre a busca para obter mais detalhes, vejo que há 200 execuções e estima-se 199,98. Portanto, se meu palpite estiver correto, a estimativa está correta.
Alguém pode me confirmar se é isso mesmo? E se sim, sou o único a pensar que isso é incrivelmente enganoso (especialmente ao passar o mouse sobre as setas)? Se ajudar, aqui está o script para configurar e reproduzir o plano acima:
-- 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
Sim, este é o caso - o SSMS nem sempre mostra as linhas estimadas * o número de execuções, e isso obviamente pode levar a algumas suposições imprecisas se você não se aprofundar como fez. Mas tecnicamente a resposta à sua pergunta é não. Às vezes, o SSMS obterá essa estimativa correta, dependendo do operador e de outras semânticas.
No SentryOne Plan Explorer , tentamos compensar isso mostrando linhas do SQL Server * número de execuções em vários casos, em vez de apenas copiar cegamente a contagem de linhas do plano XML. Seu plano, por exemplo:
Parece que este é um recurso de loops aninhados, onde as linhas estimadas parecem ser o valor por execução dentro do loop aninhado:
linhas estimadas linhas reais e contagem de execuções
Mais especificamente: