11.16.11 同義語検索のチューニングを行う
同義語検索のチューニングを行う際は,ここで説明することを検討および確認してください。
(1) テキストインデクスの定義を検討する
文書データを格納している列にテキストインデクスを定義していない場合は,テキストインデクスの定義を検討してください。テキストインデクスを定義すると,アクセスするページ数を減らすことができるため,検索性能の向上が見込まれます。
(2) テキストインデクスが効果的に使用されているかを確認する
アクセスパスの統計情報に出力されるData_tidx_all_search_cntの値を確認してください。この値が1以上で値が大きいほど,テキストインデクスが効果的に使用されていません。Data_tidx_all_search_cntには,テキストインデクスを使用してチャンク内のデータを検索した際,チャンク内のデータを全件検索した回数が出力されます。
次に示すどちらかの条件を満たすSQL文を指定している場合は,SQL文を変更することで同義語検索の性能が向上することがあります。
-
同義語検索指定を指定したスカラ関数CONTAINS,LIKE述語,LIKE_REGEX述語を使用した条件を,論理演算子ORを使って複数指定している場合
-
同義語検索指定を指定したスカラ関数CONTAINSを,論理演算子ORを使って複数指定している場合
この場合,UNIONを指定してそれぞれの検索結果を統合するか,またはテキストインデクスを使用しないで検索することを検討してください。
SQL文の変更例を次に示します。
- <変更前>
-
SELECT "TITLE" FROM "REPORTS" WHERE CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","データベース")')>0 OR CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","アプリケーションサーバ")')>0 OR 〜
- <変更後>
-
-
UNIONを使用する場合
SELECT "TITLE" FROM "REPORTS" WHERE CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","データベース")')>0 UNION DISTINCT SELECT "TITLE" FROM "REPORTS" WHERE CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","アプリケーションサーバ")')>0 UNION DISTINCT 〜
-
テキストインデクスを使用しない場合
SELECT "TITLE" FROM "REPORTS" /*>> WITHOUT INDEX <<*/ WHERE CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","データベース")')>0 OR CONTAINS("DOCUMENTS",'SYNONYM("Dictionary1","アプリケーションサーバ")')>0 OR 〜
-
(3) 同義語辞書ファイルへのアクセス時間を確認する
同義語検索が行われた場合,HADBサーバは同義語辞書ファイルにアクセスします。そのため,専用のファイルシステムに同義語辞書ファイルの格納ディレクトリだけを作成すると,同義語検索の性能向上が見込まれます。
SQL文の統計情報に出力されるSyndict_file_access_timeの値を確認してください。Syndict_file_access_timeには,HADBサーバが同義語辞書ファイルにアクセスしている時間が出力されます。SQL文の実行時間のうち,Syndict_file_access_timeの時間が占める割合が大きい場合は,専用のファイルシステムに同義語辞書ファイルの格納ディレクトリを作成することを検討してください。
同義語辞書ファイルの格納ディレクトリを変更する方法については,「11.16.13 同義語辞書ファイルの格納ディレクトリを変更する」を参照してください。