为什么我的编译linq查询第一次变慢?

时间:2010-01-05 20:09:22

标签: c# .net linq-to-sql

我们最近开始使用编译查询以提高Linq to SQL设置的性能。有几个查询总是需要多秒才能在后续运行中第一次运行一秒钟。这似乎是因为在第一次进行调用之前,编译实际上并不存在。

是否有一种简单的方法可以在编译程序期间或至少在启动期间强制执行此编译?

编辑: 所以从评论我看到它看起来像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 个答案:

答案 0 :(得分:1)

执行SQL时,数据库将缓存两件事:

  1. 执行计划
  2. 数据
  3. 执行计划将保留在缓存中,以便后续调用同一查询,直到“过期”。 但是,数据缓存通常会在性能上产生最大的差异,因为数据保存在内存中,因此后续调用不需要访问磁盘即可获得它。

答案 1 :(得分:0)

服务器需要是第一次执行时的查询计划,然后使用缓存计划进行后续执行。

答案 2 :(得分:0)

Sql Cashes数据第一次将改善其他运行。 。 。您可以创建通过调用运行的脚本,以便它们将被兑现。您可以将此添加到安装过程中。 。 。 。这可能有用。

您可以制作一个表格来更新所需的信息。这样,当您需要其可读的信息时。 (如果有很多关于将数据放在一起的处理方法)

答案 3 :(得分:0)

jalf在评论中指出,这与SQL无关,而且与编译查询在运行时编译而不是在编译期间编译的事实有关。

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