約150,000行のテーブルのテキストフィールド(varchar 500)を検索する必要があります。大きなテーブルでテキストを検索する最も効率的な方法は何ですか?
Select p.ProductID,
p.ProductDescription,
p.SalesPrice
From Products p
Where p.ProductDescription Like '%' + @PartialDescription + '%'
結果はかなり遅かった:
私が試した最初のオプションは次のようになりますDBサーバー上で直接、ストアドプロシージャを実行していました。 ProductDescriptionのインデックスを使用しても、パフォーマンスは十分に速くはありませんでした。
私は、次の手順で作品を思い付いた次のソリューション:
- がタイプ製品の一覧に全体Productsテーブルを読み込み、それをキャッシュします。私は、検索を行う必要があり
毎回は、私がコレクションを通過し、
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)。それをより速くするために私は何ができますか?
データベースに直接検索すると、あらゆる種類の最適化でより良いソリューションになる可能性がありますか?どのように私はそれを最適化できますか?
したがって、DBレベル(FTS)で検索するのが最適ですか?アプリケーション層でそれをやっている点は何もありませんか? (@Alokの場合も同じ質問)何か洞察? – Romeo
IMHO、少数の行を扱っているのでなければ、私はdbレベルでやっています。すべての行を戻してアプリケーション層で実行することは、大量のデータにはあまり適していません。 – AdaTheDev
ありがとう、FTSを試みます。 – Romeo