フルテキスト クエリのパフォーマンスのチューニングと最適化
フルテキスト クエリのパフォーマンスは、メモリ、ディスク速度、CPU 速度、コンピュータ アーキテクチャなど、さまざまなハードウェア リソースの影響を受けます。
フルテキスト クエリのパフォーマンスを向上させるための推奨事項
フルテキスト クエリのパフォーマンスを向上させるための推奨事項を次に示します。
ALTER INDEX REORGANIZE を使用して、ベース テーブルのインデックスの断片化を解消します。
ALTER FULLTEXT CATALOG REORGANIZE を使用して、フルテキスト カタログを再構成します。このステートメントを実行するとそのカタログのフルテキスト インデックスがマスタ マージされるため、この作業はパフォーマンス テストの前に行うようにしてください。
フルテキスト キー列として、サイズの小さい列を選択します。900 バイトの列がサポートされていますが、フルテキスト インデックスでは比較的小さいキー列を使用することをお勧めします。int および bigint を使用すると、最適なパフォーマンスが得られます。
整数型のフルテキスト キーを使用すると、docid マッピング テーブルとの結合が回避されます。したがって、整数型のフルテキスト キーにより、クエリのパフォーマンスが大幅に向上し、クロールのパフォーマンスも向上します。フルテキスト キーがクラスタ化インデックス キーでもある場合、パフォーマンスがさらに向上する可能性があります。詳細については、「フルテキスト インデックスの構造」および「フルテキスト キー列を調査する方法 (Transact-SQL)」を参照してください。
複数の CONTAINS 述語を 1 つの CONTAINS 述語に統合します。SQL Server では、CONTAINS クエリに列の一覧を指定できます。
フルテキスト キーまたは順位情報だけが必要な場合は、CONTAINS の代わりに CONTAINSTABLE を使用し、FREETEXT の代わりに FREETEXTTABLE を使用します。
結果を制限してパフォーマンスを向上させるには、FREETEXTTABLE 関数および CONTAINSTABLE 関数の top_n_by_rank パラメータを使用します。top_n_by_rank を使用すると、最も関連性の高いヒットだけを呼び出すことができます。ビジネス シナリオですべてのヒットを呼び出す必要がない場合 (つまり、総呼び出しが不要な場合) にのみ、このパラメータを使用してください。
注意 一般に、総呼び出しは法務シナリオで必要とされますが、e ビジネスなどのビジネス シナリオではパフォーマンスの方が重視されることがあります。
フルテキスト クエリ プランをチェックして、適切な結合プランが選択されていることを確認します。必要であれば結合ヒントやクエリ ヒントを使用します。フルテキスト クエリでパラメータが使用されている場合は、パラメータの初回の値によってクエリ プランが決定されます。OPTIMIZE FOR クエリ ヒントを使用すると、クエリのコンパイルに使用される値を強制的に指定できます。これにより、決定的なクエリ プランを実現してパフォーマンスを強化できます。
非常に多くのフルテキスト インデックス フラグメントがフルテキスト インデックスに含まれている場合、クエリのパフォーマンスが大幅に低下する可能性があります。フラグメントの数を減らすには、ALTER FULLTEXT CATALOGTransact-SQL ステートメントの REORGANIZE オプションを使用してフルテキスト カタログを再構成します。このステートメントは、実質的に、すべてのフラグメントを単一のより大きなフラグメントにマージし、フルテキスト インデックスから古いエントリをすべて削除します。
SQL Server 2008 のフルテキスト検索では、CONTAINSTABLE で指定した論理演算子 (AND、OR) を、SQL 結合として、またはフルテキスト実行 STVF (ストリーミング テーブル値関数) 内部に実装できます。通常、論理演算子を 1 種類だけ使用するクエリはフルテキスト実行によってのみ実装され、論理演算子が混在するクエリは SQL 結合も保持します。フルテキスト実行 STVF 内部に論理演算子を実装すると、複数の特別なインデックス プロパティが使用され、SQL 結合よりはるかに高速になります。この理由から、可能な限り 1 種類だけの論理演算子を使用してクエリを作成することをお勧めします。
選択的リレーションの述語が含まれているアプリケーションにおいて、選択的リレーションの述語と非選択的なフルテキスト述語を使用するクエリでは、クエリ オプティマイザを使用するように記述した場合に最適なパフォーマンスを得られる可能性があります。この場合、効果的なクエリ プランを作成するために述語を利用するかプッシュダウンを適用するかが、クエリ オプティマイザによって判断されます。この方法は、リレーショナル データをフルテキスト データとしてインデックス作成するよりも単純であり、多くの場合、効率的でもあります。
ワード ブレーカ、類義語辞典、およびストップ リストの組み合わせによるトークン化の結果の表示
特定のワード ブレーカ、類義語辞典、およびストップ リストの組み合わせをクエリ文字列入力に適用した後に、sys.dm_fts_parser 動的管理ビューを使用してトークン化の結果を表示できます。詳細については、「sys.dm_fts_parser (Transact-SQL)」を参照してください。