興味深い問題があり、誰かが光を当てるのを手伝ってくれることを望んでいました. 大まかな問題は次のとおりです。
次のクエリはすばやく (1 秒) 実行されます。
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
ただし、クエリにフィルターを追加すると、返されるまでに約 2 分かかります。
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
WHERE SA.CHG_DATE>'19 Feb 2010'
2 つのクエリの実行計画を見ると、2 番目のケースでは、実際の行数と推定行数に大きな違いがある場所が 2 つあります。これらは次のとおりです。
1) FulltextMatch テーブル値関数の場合、見積もりは約 22,000 行で、実際の行は 2,900 万行 (その後、結合前に 1,670 行にフィルター処理されます) および 2) フルテキスト インデックスのインデックス シークの場合、見積もりは 1 行で、実際は 13,000 行です
見積もりの結果、オプティマイザーはネストされたループ結合を使用することを選択しているため (少数の行を想定しているため)、計画は非効率的です。
この問題を回避するには、(a) クエリをパラメータ化して OPTION (OPTIMIZE FOR UNKNOWN) をクエリに追加するか、(b) HASH JOIN の使用を強制します。どちらの場合も、クエリは 1 秒未満で返され、見積もりは妥当に見えます。
私の質問は、「パフォーマンスの低いケースで使用されている推定値が非常に不正確である理由と、それらを改善するために何ができるか」ということです。
ここで使用されているインデックス付きビューのインデックスに関する統計は最新です。
どんな助けでも大歓迎です。