0

CompiledQueryLINQ to SQL(WP7、C#、およびSQLCE 3.5データベース)でを使用しようとしていますが、最初の使用後、クエリの速度がコンパイルされていない速度に低下します。私はこれに不慣れで、明らかな何かを見逃したと確信していますが、何がわからないのです。

コンテキストとして、私はかなり大きな用語のデータベース(約100,000レコード)を持っており、このデータベースを検索したいと思います。さまざまなアプローチと最適化を試した後でも、クエリは非常に遅いため、を使用することを検討しCompileQueryました。

以下は、私がLINQPadで一緒に投げたコードです。

// A list of search terms
List<string> keywords = new List<string>()
{
    "almond",
    "banana",
    "chocolate",
    "date",
    "elderberry",
};

// Searches for each keyword in the database
void Main()
{
    int i = 0;

    while (i < keywords.Count)
    {
        Stopwatch timer = Stopwatch.StartNew();

        IQueryable<Result> r = CQ(this, keywords[i]);

        timer.Stop();

        Console.WriteLine("Query: {0}\nTime: {1}ms\n",
            query,
            timer.ElapsedMilliseconds);

        i++;
    }
}

// The compiled query property
static Func<TypedDataContext, string, IQueryable<Result>> CQ
{
    get
    {
        return CompiledQuery.Compile<TypedDataContext, string, IQueryable<Result>>
        (
            (TypedDataContext dc, string query) =>    
            (
                from x in dc.MyTable
                where x.MyColumn.Contains(query)
                select new Result
                {
                    Something = x.MyColumn
                }
            )
        );
    }
}

// A simple class to hold the results
class Result
{
    public string Something { get; set; }
}

もちろん、これは過度に単純化されていますが、あなたはその考えを理解しています。現在、生成される結果は次のとおりです。

Query: almond
Time: 14ms

Query: banana
Time: 1197ms

Query: chocolate
Time: 1191ms

Query: date
Time: 1226ms

Query: elderberry
Time: 1201ms

誰もが言うことは、最初のクエリは遅くなりますが、後続のクエリは速くなるということです。ただし、私の場合は逆です。最初のクエリはコンパイルされているように見えますが、後者のクエリはコンパイルされていません。

それは明らかなことだと思いますが、何が欠けているのかわかりません。ポインタはありますか?

よろしくお願いします!

4

1 に答える 1

1

クエリコンパイルのデリゲート結果を静的バッキングフィールドに保存してみてください。プロパティにアクセスするたびに再コンパイルする可能性があります。最初の実行が非常に速い理由がわかりません。データに関連するものはあり得ないのですか?

于 2012-04-25T15:47:30.610 に答える