-1

ワイルドカード検索を行う必要がある状況にいます。人々は単語の一部を検索しているため、全文索引は役に立ちません。検索の最初から % を取り除いて高速化することはできません。

検索する必要がある 2 つのフィールドがあり、いずれかで一致するものを返す必要があります。1 つのフィールドだけを検索する場合は非常に高速ですが (行数は多くありません)、両方を検索するとすぐに非常に遅くなります。

詳細には触れませんが、アイデアを提供するために、

... AND (T1.Field1 LIKE '%search%')

また

... AND (T2.Field1 LIKE '%search%')

0.0695秒かかります

しかし、私がするとき

... AND (T1.Field1 LIKE '%search%' OR T2.Field1 LIKE '%search%')

35秒かかります

これを最適化するにはどうすればよいですか? OR によって検索時間が大幅に増加するのはなぜですか?

要求された未編集のクエリ全体:

SELECT CDR.Status AS CDRStatus, D.VendorID, D.RevisionOfID, D.Revision, D.DocumentID, D.Title, D.OriginalFilename 
FROM Documents AS D
LEFT JOIN CompanyDocumentReviews AS CDR ON CDR.DocumentID = D.DocumentID
LEFT JOIN Vendors AS V ON V.VendorID = D.VendorID
LEFT JOIN VendorAliases AS VA ON VA.Vendor1ID = V.VendorID AND VA.Vendor2ID != V.VendorID
LEFT JOIN Vendors AS V2 ON V2.VendorID = VA.Vendor2ID
WHERE D.Status != 'Deleted' AND (V1.VendorName LIKE '%search%' OR V2.VendorName LIKE '%search%')
4

2 に答える 2

1

2 番目の条件 (T2.Field1 LIKE '%search') のみを使用したクエリでもすぐに返される場合は、代わりに UNION を試すことができます。

(SELECT ... AND (T1.Field1 LIKE '%search%'))
UNION
(SELECT ... AND (T2.Field1 LIKE '%search'))
于 2013-06-03T22:52:10.140 に答える
0

LIKE '%search%'スケーリングしないため、テーブル全体のスキャンが必要になるため、テーブルが大きくなるにつれて検索が遅くなります。LIKE 'search%'列にインデックスが存在する場合はインデックスを使用し、はるかに高速になります。

于 2013-06-03T23:05:09.140 に答える