Die Formel zum Schätzen von Zeilen wird ein wenig albern, wenn der Filter "größer als" oder "kleiner als" ist, aber es ist eine Zahl, zu der Sie gelangen können.
Die Zahlen
Unter Verwendung von Schritt 193 sind hier die relevanten Zahlen:
RANGE_ROWS = 6624
EQ_ROWS = 16
AVG_RANGE_ROWS = 16.1956
RANGE_HI_KEY aus dem vorherigen Schritt = 1999-10-13 10: 47: 38.550
RANGE_HI_KEY aus dem aktuellen Schritt = 1999-10-13 10: 51: 19.317
Wert aus der WHERE-Klausel = 1999-10-13 10: 48: 38.550
Die Formel
1) Suchen Sie die ms zwischen den beiden Hi-Tasten
SELECT DATEDIFF (ms, '1999-10-13 10:47:38.550', '1999-10-13 10:51:19.317')
Das Ergebnis ist 220767 ms.
2) Passen Sie die Anzahl der Zeilen an
Wir müssen die Zeilen pro Millisekunde finden, aber bevor wir dies tun, müssen wir die AVG_RANGE_ROWS von den RANGE_ROWS subtrahieren:
6624 - 16.1956 = 6607.8044 Zeilen
3) Berechnen Sie die Zeilen pro ms mit der angepassten Anzahl von Zeilen:
6607.8044 Zeilen / 220767 ms = .0299311 Zeilen pro ms
4) Berechnen Sie die ms zwischen dem Wert aus der WHERE-Klausel und dem aktuellen Schritt RANGE_HI_KEY
SELECT DATEDIFF (ms, '1999-10-13 10:48:38.550', '1999-10-13 10:51:19.317')
Dies ergibt 160767 ms.
5) Berechnen Sie die Zeilen in diesem Schritt anhand der Zeilen pro Sekunde:
.0299311 Zeilen / ms * 160767 ms = 4811,9332 Zeilen
6) Erinnern Sie sich, wie wir die AVG_RANGE_ROWS früher subtrahiert haben? Zeit, sie wieder hinzuzufügen. Nachdem wir die Zahlen für Zeilen pro Sekunde berechnet haben, können wir auch die EQ_ROWS sicher hinzufügen:
4811,9332 + 16,1956 + 16 = 4844,1288
Abgerundet ist dies unsere Schätzung von 4844,13.
Testen der Formel
Ich konnte keine Artikel oder Blog-Beiträge darüber finden, warum AVG_RANGE_ROWS abgezogen wird, bevor die Zeilen pro ms berechnet werden. Ich war sie in der Lage zu bestätigen , wird in der Schätzung berücksichtigt, sondern nur in der letzten Millisekunde - buchstäblich.
Unter Verwendung der WideWorldImporters-Datenbank habe ich einige inkrementelle Tests durchgeführt und festgestellt, dass die Abnahme der Zeilenschätzungen bis zum Ende des Schritts linear ist, wobei plötzlich 1x AVG_RANGE_ROWS berücksichtigt wird.
Hier ist meine Beispielabfrage:
SELECT PickingCompletedWhen
FROM Sales.Orders
WHERE PickingCompletedWhen >= '2016-05-24 11:00:01.000000'
Ich habe die Statistiken für PickingCompletedWhen aktualisiert und dann das Histogramm erhalten:
DBCC SHOW_STATISTICS([sales.orders], '_WA_Sys_0000000E_44CA3770')
Um zu sehen, wie sich die geschätzten Zeilen verringern, wenn wir uns dem RANGE_HI_KEY nähern, habe ich während des gesamten Schritts Proben gesammelt. Die Abnahme ist linear, verhält sich jedoch so, als ob eine Anzahl von Zeilen, die dem AVG_RANGE_ROWS-Wert entsprechen, nicht Teil des Trends ist ... bis Sie den RANGE_HI_KEY treffen und sie plötzlich wie nicht eingezogene Schulden fallen. Sie können es in den Beispieldaten sehen, insbesondere in der Grafik.
Beachten Sie den stetigen Rückgang der Zeilen, bis wir RANGE_HI_KEY und dann BOOM treffen, wobei der letzte AVG_RANGE_ROWS-Block plötzlich subtrahiert wird. Es ist auch leicht, in einem Diagramm zu erkennen.
Zusammenfassend lässt sich sagen, dass die ungerade Behandlung von AVG_RANGE_ROWS die Berechnung von Zeilenschätzungen komplexer macht. Sie können jedoch jederzeit abgleichen, was der CE tut.
Was ist mit Exponential Backoff?
Exponential Backoff ist die Methode, die der neue Kardinalitätsschätzer (ab SQL Server 2014) verwendet, um bessere Schätzungen zu erhalten, wenn mehrere einspaltige Statistiken verwendet werden. Da es sich bei dieser Frage um eine einspaltige Statistik handelt, handelt es sich nicht um die EB-Formel.