2012-01-17 19 views
3

約150,000行のテーブルのテキストフィールド(varchar 500)を検索する必要があります。大きなテーブルでテキストを検索する最も効率的な方法は何ですか?

Select p.ProductID, 
    p.ProductDescription, 
    p.SalesPrice 
From Products p 
Where p.ProductDescription Like '%' + @PartialDescription + '%' 

結果はかなり遅かった:

私が試した最初のオプションは次のようになりますDBサーバー上で直接、ストアドプロシージャを実行していました。 ProductDescriptionのインデックスを使用しても、パフォーマンスは十分に速くはありませんでした。

私は、次の手順で作品を思い付いた次のソリューション:

  1. がタイプ製品の一覧に全体Productsテーブルを読み込み、それをキャッシュします。私は、検索を行う必要があり
  2. 毎回は、私がコレクションを通過し、

    List<Product> searchResultItems = new List<Product>(); 
    for (int i = 0; i < cachedProducts.Count; i++) 
    { 
        Product p = cachedProducts[i]; 
    
        if (p.Description.IndexOf(partialDescription, StringComparison.OrdinalIgnoreCase)>=0) 
        { 
         searchResultItems.Add(p); 
        } 
    } 
    return searchResultItems; 
    

以下のように文字列の比較ですが行うこのソリューションでは、データベースに直接それを検索するよりも少し速いです。 テーブルをメモリにキャッシュすることにより、大量のデータベース呼び出しを回避します。 しかし、それはまだレガシーシステム(FileMakerで10年以上前に構築されたもの)と比較して遅いです。 私はレガシーシステムのソースコードにアクセスすることはできず、あまり知らない。

MS SQL Server 2008データベース(System.Runtime.CachingのObjectCacheを利用してC#とキャッシュに書かれたコード)では、私のソリューションがレガシーシステムよりも簡単に優れていることを期待していました。恥ずかしいことに、その事件ではない。 検索方法を最適化するにはどうすればよいですか?私は間違って何をしていますか?上記の関数はWCFサービスに存在し、ファンシーコントロールなしでWebアプリケーションによって消費されます(basicHttpBinding)。それをより速くするために私は何ができますか?

データベースに直接検索すると、あらゆる種類の最適化でより良いソリューションになる可能性がありますか?どのように私はそれを最適化できますか?

答えて

4

ワイルドカード接頭辞を使用して値を検索しているため、索引を使用できないため、常に表スキャンを実行します。

Full Text Searchを見ることができます。

+0

したがって、DBレベル(FTS)で検索するのが最適ですか?アプリケーション層でそれをやっている点は何もありませんか? (@Alokの場合も同じ質問)何か洞察? – Romeo

+0

IMHO、少数の行を扱っているのでなければ、私はdbレベルでやっています。すべての行を戻してアプリケーション層で実行することは、大量のデータにはあまり適していません。 – AdaTheDev

+0

ありがとう、FTSを試みます。 – Romeo

5

MS SQL 2008を使用している場合は、全文検索を使用することをお勧めします。テーブルでFTインデックスを有効にしてから、FTSのヒントに従ってテキストを検索します。

1

ProductDescriptionのインデックスであっても、パフォーマンスは十分に速くありませんでした。初心者のための

SQL:

'%' + @PartialDescription + '%'

Triggersa全表スキャン、インデックスがあるためbeginnnign "%" で使用することはできません。標準的なインデックスは、個々の単語を検索するのに役立ちます。その後、基本的には、インデックスの使用を取得し、約150,000行

玩具サイズとテーブルの上にすぐに返します

を取得する必要があります - あなたはそれを取り除くに対処できる場合

。あなたが2GBのvpsで動かない限り。

%を削除するかフルテキストインデックスに移動します。

+0

15万行のテーブルはあなたのための "おもちゃ"ですか?あなたは非常に賢い人です。 +1あなたの非常に励みになるコメント。私は今私の机に戻り、おもちゃで遊んでいきます。 ありがとうございます。 – Romeo

+0

です。私はテーブルに一日に4000万行を読み込む世界に住んでいます。私たちは450,000のビジネスオブジェクトを7分で処理します。その中には、25万のディテール行が20個近くあります。 10万年前は150.000だった。 20年前、foxproは100万エントリの行を扱うのに何の問題もありませんでした。現実的なものになりました。今日、小規模なエンドでは16GBのメモリ、250GBのメモリを備えたデータベースサーバを備えたワークステーションがあります。 – TomTom

関連する問題