多くのテーブル (10-11) にまたがるかなり複雑なストアド プロシージャをデバッグしようとしています。ツリーの一部で、推定された行数が実際の行数と大幅に異なることがわかりました。実際には 55,000 行が返されるのに、最悪の場合、SQL サーバーは 1 行が返されると見積もっています!
これがなぜなのかを解明しようとしています - すべての統計は最新であり、いくつかのテーブルで FULLSCAN を使用して統計を更新しました。ユーザー定義関数やテーブル変数は使用していません。私が見る限り、SQL サーバーは返される行数を正確に見積もることができるはずですが、数万回の RDI ルックアップを実行する場合の計画を引き続き選択します (1 回だけ実行すると予想される場合)。または 2)。
推定行数が大幅にずれている理由を理解するにはどうすればよいですか?
更新:計画を見て、特に疑わしいと思われる1つのノードを見つけました-それは、次のプレデケートを使用したテーブルのテーブルスキャンです。
status <> 5
AND [type] = 1
OR [type] = 2
この述語はテーブル全体を返します (630 行 - テーブル スキャン自体がパフォーマンスの低下の原因ではありません) が、SQL サーバーの推定行数はわずか 37 です。SQL サーバーは、これを使用して RDI に対していくつかのネストされたループを実行し続けます。ルックアップ、インデックス スキャン、およびインデックス シーク。これが私の大規模な誤算の原因でしょうか? より賢明な行数を見積もるにはどうすればよいですか?