編集
http://technet.microsoft.com/en-us/library/cc721269.aspx#_Toc202506240から
最も重要なことは、フルテキスト クエリに対して正しい結合タイプが選択されることです。FulltextMatch STVF でのカーディナリティの推定は、適切な計画にとって非常に重要です。したがって、最初に確認することは、FulltextMatch カーディナリティの推定です。これは、全文検索文字列のインデックス内の推定ヒット数です。たとえば、図 3 のクエリでは、これは用語「単語」を含むドキュメントの数に近いはずです。ほとんどの場合、それは非常に正確なはずですが、見積もりが大幅にずれていた場合、不適切な計画が作成される可能性があります。通常、単一項の推定は非常に良好です。ただし、語句や AND クエリなどの複数の用語の推定は、インデックス内の用語の頻度に基づいてインデックス内の用語の交差がどうなるかを知ることができないため、より複雑です。カーディナリティの見積もりが良好な場合、不適切な計画はおそらくクエリ オプティマイザーのコスト モデルが原因です。プランの問題を修正する唯一の方法は、クエリ ヒントを使用して、特定の種類の結合または OPTIMIZE FOR を強制することです。
そのため、2 つの検索用語がまったく独立している可能性が高いのか、それとも一般的に一緒に見つかる可能性が高いのかを、保存されている情報から知ることはできません。おそらく、オプティマイザーに処理を任せる単一ワード クエリ用と、「十分な」計画を強制する複数ワード プロシージャ用の 2 つの別個のプロシージャが必要です (sys.dm_fts_index_keywords が必要ない場合は、 1 つのサイズですべてのプランに適合します)。
注意: 記事のこの部分を見ると、単語プロシージャーに WITH RECOMPILE オプションが必要になる可能性があります。
SQL Server 2008 の全文検索では、使用された検索用語の基数推定に基づいて生成された計画を変更することができます。クエリ プランが固定されている場合 (ストアド プロシージャ内のパラメーター化されたクエリのように)、この手順は実行されません。したがって、このプランが特定の検索語にとって理想的でない場合でも、コンパイルされたプランは常にこのクエリを提供します。
元の回答
ただし、新しい計画はまだかなり悪いようです。全文クエリ パーツから 1 行しか返されていないように見えますが、Product テーブルの 770159 行すべてがスキャンされています。
これはどのように機能しますか?
CREATE TABLE #tempResults
(
ID int primary key,
Name varchar(200),
DateMadeNew datetime
)
INSERT INTO #tempResults
SELECT
ID, Name, DateMadeNew
FROM Product
WHERE contains(Name, '"White Dress"')
SELECT TOP 1
*
FROM #tempResults
ORDER BY DateMadeNew desc