2012-01-25 14 views
3

状況:私は「LIKE」を使用して効率的なクエリを記述しようとしています改善「%%LIKE」クエリ

文は短い文章で列にテキストの一部世話します。

モデル:

Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO } 

Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME } 

Table 'EVENTSINFOTYPES' : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION } 

インデックス:EVENTSGENERAL.GENERATOREVENTSGENERAL.DATETIMEEVENTSINFOTYPES.INFOTYPE すべての昇順。

マイクエリ:

SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME, A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO 
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_ 
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE 
WHERE C.DESCRIPTION LIKE '%VALUE%' 

問題:

このクエリは、余分な大規模なデータベース上で実行されます。私はそれを改善する方法はありますか? 私はFirebirdデータベースを使用しています。

ありがとうございます。

答えて

7

LIKEキーワードの両側にワイルドカード(%)を使用しているため、残念ながらそうではありません。先頭のワイルドカードとは、検索速度を向上させるために索引を使用できないため、すべての行を調べて条件を満たすかどうかを確認することです。

代わりにLIKE 'VALUE%'に変更することで、ややスピードを上げることができます。インデックスを少なくとも使用して、検索対象の行をVALUEで始まる行に限定することができます。

+0

などの他、専門的なソリューション、になっているはずですか?それは速くなるでしょうか? –

+0

LIKE 'VALUE%'を意味する場合は、パフォーマンスの向上のためにVALUEにインデックスを付けることができます。索引を作成してから、「説明計画」と同等のFilebirdを実行することができます。 –

+0

クエリスピードに 'LIKE 'VALUE%'の効果が含まれるように編集されました。 –

3

全文検索(%VALUE%を使用)は効率的な方法がないため、遅いです。 には、という文字が含まれているすべての単語のリストを作成する辞書のようなものです。That's takes forever。一方、VALUE%を探すだけであれば(検索フィールドにインデックスが付けられていると)はるかに簡単です。 がすべての文字Qで始まるすべての単語のリストを作成するようなものです。単語がアルファベット順にソートされている(辞書にあるように)のは簡単です。あなたは最初と最後の言葉を簡単に見つけることができます。あなたは間違いなくすべてを必要としていることを確信できます。

データベースによっては、フルテキスト検索が可能なものもありますが、列内の各単語を索引付けできますが、完全な単語のみを索引付けできます。したがって、%q%の検索はまだ遅く、q%の検索は高速になります。私はFirebirdがそれをサポートしているかどうかはわかりません。

あなたが大規模なデータベースを持っていて、%q%を検索できるようにしたい場合は、私が代わりに「%LIKE」を使用した場合に変化するであろう何LuceneまたはXapian

+0

その説明をくれてありがとう、それはデータベースのインデックスを作成し、物事をスピードアップするために 'Word%'クエリを使用しました。私が望んでいたものではありませんが、少なくとも今は助けています。 最初のリリース後、私はluceneが自分のニーズに合っているかどうかをチェックするかもしれません。 もう一度おねがいします! –

+0

私は "エル・コルテ・イングレス"の問題が何であるかを見ます。 –