質問: sqlserverを利用しています。 フルテキストインデックスを用意し、検索を行っています。 現在のレコード数は約1億レコードあります。 現在、テストを行っているのですが、対象レコードが多いキーワードにて検索すると、 10秒ほどかかっております。 対象レコードが少ないキーワードにて検索すると、即座にレスポンスがある状況です。 実行しているSQLは下記のような内容です。 select * from [TABLE_NAME] where CONTAINS([TITLE],'"*[KEYWORD]*"') ORDER BY [identity_column_name] DESC OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY 対象レコードで合致するものが、上記SQLであれば20件該当すれば抜けるとイメージしておりますが、 該当件数が多い場合に、レスポンスが遅くなる理由が解らず困っております。 環境 Windows Server 2016 SQL Server 2017 CPU E5-2650*2 MEMORY 192GB DBサイズ 約120GB ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/6c065f3376943b9b893b9fa4a543e7cb.gif) ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2a4a6c25002eada39ccb8f3e5b5d30fc.gif)
回答: identity_column_nameに関するインデックスはありますか? また、desc指定していますか? 追記 select で使用されるインデックスは一つだけですので、そのインデックスに、whereやorder byでの項目が含まれている必要があります。 インデックスを分けて使用されるようにネストしてみましょう。 [identity_column_name] DESC のインデックスが有る状態で、以下の問い合わせで改善されないでしょうか。 ``` select * from [TABLE_NAME] where プライマリーキー in ( select プライマリーキー from [TABLE_NAME] where CONTAINS([TITLE],'"*[KEYWORD]*"') ) ORDER BY [identity_column_name] DESC OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY ``` 但し、上記は、そもそも以下のSQLが単独で早くないと意味はありません。 ``` select * from [TABLE_NAME] ORDER BY [identity_column_name] DESC OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY ``` ``` select プライマリーキー from [TABLE_NAME] where CONTAINS([TITLE],'"*[KEYWORD]*"') ``` 2番目が遅いという事なので、検索結果が少なくなるように条件を工夫するようなアプローチを考えないと駄目かもしれませんね。 例えば、 ``` select * from [TABLE_NAME] where CONTAINS([TITLE],'"*[KEYWORD]*"') OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY ``` ``` select count(*) from [TABLE_NAME] where CONTAINS([TITLE],'"*[KEYWORD]*"') ``` などで(後者は遅いかもですが)、閾値を超える場合に、条件を追加するようにメッセージを出すとか。