Wenn ich mir Ausführungspläne ansehe, vergleiche ich häufig "Geschätzte Anzahl von Zeilen" mit "Tatsächliche Anzahl von Zeilen" und suche nach Unstimmigkeiten. Wenn ich zum Beispiel über den unteren Pfeil im Bild unten schwebe, ist die Schätzung 1 und die tatsächliche 200, sodass es auf den ersten Blick eine schreckliche Schätzung zu sein scheint.
Ich habe mich jedoch gefragt, ob dies tatsächlich die Schätzung für nur eine Ausführung ist. Wenn ich über die Suche nach mehr Details schwebe, sehe ich, dass es 200 Hinrichtungen gibt, und es werden 199,98 geschätzt. Wenn meine Vermutung richtig ist, ist die Schätzung tatsächlich tot.
Kann mir jemand bestätigen, ob dies der Fall ist? Und wenn ja, bin ich der einzige, der denkt, dass dies unglaublich irreführend ist (besonders wenn ich über den Pfeilen schwebe)? Wenn es hilft, finden Sie hier das Skript zum Einrichten und Reproduzieren des obigen Plans:
-- 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
quelle
Dies scheint eine Funktion von verschachtelten Schleifen zu sein, bei der die geschätzten Zeilen der Wert pro Ausführung innerhalb der verschachtelten Schleife zu sein scheinen:
Geschätzte-Zeilen-tatsächliche-Zeilen-und-Ausführungsanzahl
Genauer:
quelle