1

実行に約 6 秒かかるクエリを最適化しようとしています。

string[] filters = ...;   

var data =
   (from n in ctx.People
        .Where(np => np.IsActive)
    let isFilterMatch = filters.All(f => n.FirstName.ToLower().Contains(f) ||
                                         n.Prefix.ToLower().Contains(f) ||
                                         n.MiddleName.ToLower().Contains(f) ||
                                         n.LastName.ToLower().Contains(f) ||
                                         n.Information.Email.ToLower().Contains(f) ||
                                         (n.Address!= null &&
                                          (SqlFunctions.StringConvert((double)n.Address.Number).
                                               Contains(f) ||
                                           n.Address.Street.ToLower().Contains(f) ||
                                           n.Address.ZipCode.ToLower().Contains(f) ||
                                           n.Address.City.ToLower().Contains(f))))
    where isFilterMatch
    orderby n.LastName
    select n
    ).Take(numberOfItems).ToList();

これは検索ダイアログのクエリです。ユーザーは任意のテキストを入力でき、入力内容に一致する人物を検索します。ユーザー入力を文字列配列に分割し、Person フィールドで Contains を実行します。フィルター配列のため、クエリをプリコンパイルできません。

この機能を最適化するにはどうすればよいですか? Sql Server の FullTextSearch やストアド プロシージャなどについて聞いたことがあります。それは役に立ちますか?

Sql Server 2008、Entity Framework 4.0 (Model First)、および C# を使用しています。

4

1 に答える 1

0

この検索クエリには SQL クエリ / Linq クエリは使用しません。テキスト検索の通常のクエリは遅くなる可能性があり、正確な結果しか返しません。スペルや文法の誤りなどは修正しません。

SQL Server の「全文検索」機能の使用を検討してください。しかし、結果として得られるパフォーマンスは依然として不十分である可能性があります。http://www.sql-server-performance.com/2010/full-text-search-2008/を参照してください。

Apache Lucene (Lucene.NET で dll として利用可能) のような検索インデクサーを使用することをお勧めします。もう 1 つのオプションは、すべてのレコードにインデックスを付ける独自の Windows サービスを作成することです。

于 2012-08-07T13:39:21.840 に答える