CompiledQuery
LINQ 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
誰もが言うことは、最初のクエリは遅くなりますが、後続のクエリは速くなるということです。ただし、私の場合は逆です。最初のクエリはコンパイルされているように見えますが、後者のクエリはコンパイルされていません。
それは明らかなことだと思いますが、何が欠けているのかわかりません。ポインタはありますか?
よろしくお願いします!