Почему мои скомпилированные запросы linq в первый раз работают медленно? - PullRequest
3 голосов
/ 05 января 2010

Недавно мы начали использовать скомпилированные запросы, чтобы повысить производительность при настройке Linq to SQL. Существует несколько запросов, выполнение которых всегда занимает несколько секунд, а первый раз занимает менее секунды при последующих запусках. Похоже, это происходит потому, что компиляция фактически не происходит, пока вызов не будет выполнен в первый раз.

Есть ли простой способ заставить эту компиляцию произойти во время компиляции программы или, по крайней мере, во время запуска?

EDIT: Так что из комментариев, которые я вижу, похоже, что запросы linq определенно не компилируются, пока не будет выполнен вызов. Прямо сейчас я пишу мои запросы, как это:

static readonly Func<DataContext, int, IQueryable<Item>> getByPLUComp =
    CompiledQuery.Compile<DataContext, int, IQueryable<Item>>((db, PLU) =>
            from i in db.Items
            where i.IntPLU == PLU && i.Terminated == null
            select i);

У меня есть куча этих статических только для чтения Funcs. Есть ли какой-нибудь простой способ запустить программу и инициализировать ее при запуске, так что затраты будут производиться там, а не при регулярном использовании?

РЕДАКТИРОВАТЬ 2: Одна последняя попытка, прежде чем я оставлю этот вопрос. Чтобы решить эту проблему, я просто добавил вызовы к скомпилированным запросам во время инициализации моей программы. Например:

public void Initialize()
{
    DataContext db = new DataContext();
    getByPLUComp(db, 0);
}

Существует ли более элегантный способ принудительной компиляции, не выполняющий запрос и не выбрасывающий результаты?

Ответы [ 4 ]

1 голос
/ 05 января 2010

При выполнении SQL база данных будет кешировать 2 вещи:

  1. план выполнения
  2. данные

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

0 голосов
/ 24 февраля 2011

jalf указал в комментариях, что это не имеет ничего общего с SQL и связано с тем, что скомпилированные запросы компилируются во время выполнения, а не во время компиляции.

http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx

0 голосов
/ 06 января 2010

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

Вы могли бы составить таблицу, которая обновит необходимую для нее информацию. Таким образом, когда вам нужна информация, она легко доступна. (если есть много обработки для объединения данных)

0 голосов
/ 05 января 2010

Сервер должен быть планом запроса при первом выполнении, затем он использует кэшированный план для последующих выполнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...