関数の結果に基づいてフィルタリングするストアドプロシージャがありDATEADD
ます-SQLサーバーはその関数の出力に基づいて統計を保存できないため、ユーザー定義関数の使用に似ていると理解しています。実行計画。
クエリは次のようになります。
SELECT /* Columns */ FROM
TableA JOIN TableB
ON TableA.id = TableB.join_id
WHERE DATEADD(hour, TableB.HoursDifferent, TableA.StartDate) <= @Now
(したがって、結果を事前に計算することはできませんDATEADD
)
私が見ているのは、ひどいひどい実行プランです。これは、SQLサーバーがツリーの一部から返される行数を実際には約65,000であるのに、1と誤って推定しているためだと思います。ただし、データベースに異なる(必ずしも少ないわけではない)データが存在する場合、同じストアドプロシージャがほんのわずかな時間で実行されるのを見てきました。
私の質問は-このような場合、クエリオプティマイザーは関数の結果をどのように推定しますか?
更新:参考までに、私は、なぜあるときは良い実行計画を取得し、残りの時間は取得しないのかを理解することにもっと興味があります-私はこれをどのように修正するかについてすでにかなり良い考えを持っています長期的には。