SQL Server の左結合テーブルで複数の条件を全文検索するにはどうすればよいですか?
-
09-06-2019 - |
質問
もともと次のようなクエリがあります。
select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')
90,000 件のレコードがあるデータベースでは、このクエリの実行には約 7 秒かかります (明らかに、すべての結合といいね! に負担がかかります)。
関連する列の全文検索を使用してクエリの実行時間を短縮する方法を見つけようとしています。ただし、特に結合条件が検索語の一部ではないため、このような 3 つのテーブル結合を含む全文検索の例を見たことがありません。
全文検索でこれを行う方法はありますか?
@デビッド
はい、ID にはインデックスがあります。
CustomerAddress のもの (CityName、PostalCode など) にインデックスを追加しようとしたところ、クエリが 3 秒に短縮されましたが、それでもこのようなものには遅すぎると感じます。
すべてのテキスト フィールド (ID を除く) は nvarchar であり、Line1 は nvarchar 1000 であるため、速度に影響する可能性がありますが、それでも影響を受けることに注意してください。
解決
クエリ アナライザーで実行し、クエリ プランが何であるかを確認します。私の推測では、二重根(すなわち、%ae%) 検索により、一致する行を探すときにテーブル スキャンが実行されます。二重ルート検索は、通常、検索に一致させるためにいかなる種類のインデックスも使用できないため、本質的に時間がかかります。
他のヒント
注記:これは実際の答えではなく、パフォーマンス上の問題の実際の原因を明らかにする試みにすぎません。
90,000 レコードは実際にはかなり小さいデータ セットであり、クエリは 2 つの結合だけで比較的単純です。CustomerAddress.CustomerId と CustomerAccount.CustomerId にインデックスはありますか?これは、where 条件の LIKE 述部よりもパフォーマンスの問題を引き起こす可能性が高いようです。通常、これらすべての列で一致するものを同時に検索していますか?
私も David の提案に同意します。おそらく、RDBMS がクエリをどのように実行しているかを調査する必要があるでしょう (テーブル スキャンやインデックスの使用など)。
簡単なチェックの 1 つは、テキスト検索に関係するクエリの部分だけの時間を計測することです。このようなもの:
SELECT ca.Line1, ca.CityName, ca.PostalCode
FROM CustomerAddress as ca
WHERE ca.CustomerId = <some id number>
AND (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');
それに長い時間がかかる場合は、 LIKE
が問題です (式を一度に 1 つずつ削除します) OR
行を編集して、これらの列の 1 つだけが速度低下の原因となっているかどうかを確認します)。速い場合は結合が疑われます。
CustomerAccount テーブルに対しても同様のクエリを作成できます。