フィルターが「より大きい」または「より小さい」場合、行を推定する式は少し間抜けになりますが、これは到達可能な数値です。
数字
ステップ193を使用して、関連する番号は次のとおりです。
RANGE_ROWS = 6624
EQ_ROWS = 16
AVG_RANGE_ROWS = 16.1956
前のステップのRANGE_HI_KEY = 1999-10-13 10:47:38.550
現在のステップのRANGE_HI_KEY = 1999-10-13 10:51:19.317
WHERE句の値= 1999-10-13 10:48:38.550
式
1)2つの範囲のhiキー間のmsを見つける
SELECT DATEDIFF (ms, '1999-10-13 10:47:38.550', '1999-10-13 10:51:19.317')
結果は220767ミリ秒です。
2)行数を調整する
ミリ秒あたりの行を見つける必要がありますが、その前に、RANGE_ROWSからAVG_RANGE_ROWSを減算する必要があります。
6624-16.1956 = 6607.8044行
3)調整された行数でミリ秒あたりの行数を計算します。
6607.8044行/ 220767 ms = .0299311行/ ms
4)WHERE句の値と現在のステップRANGE_HI_KEYの間のmsを計算します
SELECT DATEDIFF (ms, '1999-10-13 10:48:38.550', '1999-10-13 10:51:19.317')
これにより160767 msが得られます。
5)1秒あたりの行数に基づいて、このステップの行を計算します。
.0299311行/ ms * 160767 ms = 4811.9332行
6)以前にAVG_RANGE_ROWSをどのように差し引いたか覚えていますか?それらを元に戻す時間です。1秒あたりの行数に関連する数値の計算が完了したので、EQ_ROWSも安全に追加できます。
4811.9332 + 16.1956 + 16 = 4844.1288
切り上げ、それは私たちの4844.13の見積もりです。
数式をテストする
ミリ秒あたりの行数が計算される前にAVG_RANGE_ROWSが差し引かれる理由に関する記事やブログ投稿は見つかりませんでした。私はそれらが推定で説明されていることを確認できましたが、文字通り最後のミリ秒でのみです。
WideWorldImportersデータベースを使用して、いくつかのインクリメンタルテストを行ったところ、1x AVG_RANGE_ROWSが突然含まれるステップの最後まで、行推定値の減少は線形であることがわかりました。
これが私のサンプルクエリです:
SELECT PickingCompletedWhen
FROM Sales.Orders
WHERE PickingCompletedWhen >= '2016-05-24 11:00:01.000000'
PickingCompletedWhenの統計を更新してから、ヒストグラムを取得しました。
DBCC SHOW_STATISTICS([sales.orders], '_WA_Sys_0000000E_44CA3770')
RANGE_HI_KEYに近づくにつれて推定行がどのように減少するかを確認するために、ステップ全体でサンプルを収集しました。減少は直線的ですが、AVG_RANGE_ROWS値に等しい行数がトレンドの一部ではないかのように動作します... RANGE_HI_KEYに到達し、突然、回収されていない借金のように減少します。これはサンプルデータ、特にグラフで確認できます。
RANGE_HI_KEYに到達するまで行が着実に減少し、最後のAVG_RANGE_ROWSチャンクであるBOOMが突然差し引かれていることに注意してください。グラフで見つけるのも簡単です。
要約すると、AVG_RANGE_ROWSの奇妙な扱いは行推定の計算をより複雑にしますが、CEが何をしているかを常に調整することができます。
指数バックオフはどうですか?
指数バックオフは、新しい(SQL Server 2014現在の)Cardinality Estimatorが複数の単一列統計を使用する場合に、より良い推定を取得するために使用する方法です。この質問は単一列の統計に関するものだったので、EBの式は含まれていません。