Я пытаюсь использовать CompiledQuery
в LINQ to SQL (WP7, C# и базу данных SQLCE 3.5), но после первого использования запрос замедляется до несжатых скоростей. Я новичок в этом, и я уверен, что я пропустил что-то очевидное, но я не уверен, что.LINQ to SQL CompiledQuery Slowing Down
В контексте я имею довольно большую базу данных терминов (около 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
Что все говорят, что первый запрос будет медленнее, но последующие запросы будут быстрее. Однако в моем случае все наоборот: похоже, что первый запрос скомпилирован, а последние - нет.
Я уверен, что это нечто очевидное, но я не уверен, что мне не хватает. Любые указатели?
Большое спасибо заранее!
Я думаю, что время компиляции в любом случае меньше 0,01 секунды. Это не должно быть причиной. Я бы посоветовал проверить фактические запросы к базе данных с помощью sql-профилировщика, чтобы узнать, почему это так медленно. – st78
Спасибо, Сергей, ты абсолютно прав! – Superangel