0

元々次のようなクエリがあります。

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つのテーブル結合を含む全文検索の例は見たことがありません。

全文検索でこれを行う方法はありますか?


@David

はい、IDにはインデックスがあります。

CustomerAddressのもの(CityName、PostalCodeなど)にインデックスを追加しようとしましたが、クエリが3秒に短縮されましたが、それでもこのようなものには遅すぎます。

すべてのテキストフィールド(IDを除く)はnvarcharsであり、Line1はnvarchar 1000であるため、速度に影響を与える可能性がありますが、それでもなお注意してください。

4

3 に答える 3

1

注:これは実際には答えではなく、パフォーマンスの問題を実際に引き起こしている可能性があるものを明確にするための試みにすぎません。

90,000レコードは実際にはかなり小さなデータセットであり、クエリは2つの結合だけで比較的単純です。CustomerAddress.CustomerIdとCustomerAccount.CustomerIdにインデックスがありますか?これは、条件LIKE述語よりもパフォーマンスの問題を引き起こしている可能性が高いようです。通常、これらすべての列で同時に一致するものを検索していますか?

于 2008-08-30T14:04:22.150 に答える
1

私はデビッドの提案を繰り返します。おそらく、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%');

それが長い時間がかかる場合は、LIKEsが問題です(ed行から一度に1つの式を削除してOR、それらの列の1つだけが速度低下を引き起こしているかどうかを確認します)。速い場合は、結合が疑わしいです。

CustomerAccountテーブルに対しても同様のクエリを作成できます。

于 2008-08-30T15:33:10.377 に答える
1

クエリ アナライザーで実行し、クエリ プランを確認します。私の推測では、二重ルート (つまり %ae%) 検索により、一致する行を探すときにテーブル スキャンが行われていると思います。二重ルート検索は、通常はどのような種類のインデックスも使用できないため、本質的に低速です。

于 2008-08-30T15:47:34.040 に答える