2012-04-25 4 views
0

Я пытаюсь использовать 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 

Что все говорят, что первый запрос будет медленнее, но последующие запросы будут быстрее. Однако в моем случае все наоборот: похоже, что первый запрос скомпилирован, а последние - нет.

Я уверен, что это нечто очевидное, но я не уверен, что мне не хватает. Любые указатели?

Большое спасибо заранее!

+1

Я думаю, что время компиляции в любом случае меньше 0,01 секунды. Это не должно быть причиной. Я бы посоветовал проверить фактические запросы к базе данных с помощью sql-профилировщика, чтобы узнать, почему это так медленно. – st78

+0

Спасибо, Сергей, ты абсолютно прав! – Superangel

ответ

1

Попробуйте сохранить результат делегирования компиляции запроса в статическое поле поддержки. Вероятно, вы перекомпилируете каждый раз, когда получаете доступ к своей собственности. Не уверен, почему первое исполнение так быстро. Невозможно, чтобы это было связано с данными?

+0

Спасибо! Оказывается, если я действительно что-то делаю с данными, например. добавьте 'r.Count()' в цикле, тогда начальный запрос займет намного больше времени (9 секунд), а последующие запросы будут выполняться намного быстрее (еще около 1 секунды). Хотя время запроса плохое (я думаю, вы правы, что это связано с данными), по крайней мере времена 'CompiledQuery' теперь имеют больше смысла. Спасибо, что указал мне в правильном направлении! – Superangel

 Смежные вопросы

  • Нет связанных вопросов^_^