Ist "Geschätzte Anzahl von Zeilen" immer pro Ausführung in SSMS-Ausführungsplänen?

7

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.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

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
JohnnyM
quelle

Antworten:

7

Ja, dies ist der Fall. SSMS zeigt Ihnen nicht immer die geschätzte Anzahl der Ausführungen in Zeilen * an. Dies kann offensichtlich zu ungenauen Annahmen führen, wenn Sie nicht so tief graben wie zuvor. Aber technisch gesehen lautet die Antwort auf Ihre Frage nein. Abhängig vom Operator und anderer Semantik wird SSMS diese Schätzung manchmal richtig machen.

In SentryOne Plan Explorer versuchen wir dies zu kompensieren, indem wir in mehreren Fällen die Anzahl der Ausführungen von SQL Server * anzeigen, anstatt nur blind die Zeilenanzahl aus dem Plan-XML zu kopieren. Ihr Plan zum Beispiel:

Geben Sie hier die Bildbeschreibung ein

Aaron Bertrand
quelle
1
Danke Aaron! Es scheint, als hätte SSMS diese Tatsache hervorragend verschleiert ... Ich mag die Art und Weise, wie SQL Sentry sie implementiert hat, viel besser. Ich bin auch neugierig, wie es überhaupt die Schätzung von 1 Zeile pro Ausführung bekommt? Es scheint eher eine Annahme zu sein als auf Statistiken zu basieren. Irgendeine Idee?
JohnnyM
@JohnnyM Ich denke, es wird eher eine Ausführung für den Operator angenommen als eine Ausführung pro Zeile für den Operator.
Aaron Bertrand
Nicht sicher ob ich verstehe. Nur um zu verdeutlichen, wenn SSMS "Geschätzte Anzahl von Zeilen = 1" sagt, woher kommt die 1?
JohnnyM
Ich denke, Sie haben Recht, dass dies nur eine schlechte Annahme ist, die nicht auf tatsächlichen Statistiken basiert. Und es wird nicht berücksichtigt, dass es für jede Zeile iteriert, nicht nur für eine.
Aaron Bertrand
0

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:

Sie müssen sich nur bewusst sein, dass die geschätzten Zeilen pro Ausführung und die tatsächlichen Zeilen für alle Ausführungen insgesamt sind. Vergleichen Sie also Orangen mit Orangen, nicht Orangen mit Orangenscheiben.

Simon Gregory
quelle