我们最近开始使用complied查询来提高我们的Linq to SQL设置的性能。有几个查询总是需要几秒钟的时间才能在第一次运行时在第二次运行中第一次运行。这似乎是因为编译实际上并没有发生,直到第一次打电话。为什么我的编译linq查询第一次放缓?
是否有一种简单的方法可以在编译程序期间或至少在启动过程中强制执行此编译?
编辑: 所以从我看到的看来,它看起来像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);
}
是否有更优雅的方式来强制编译,而不仅仅是运行查询并丢弃结果?
你确定它不只是因为你让首次到数据库的连接?或者说,延迟不是来自sql服务器端,这是一个缓存问题? – cyberconte 2010-01-05 20:15:52
有问题的查询不是应用程序运行的第一个查询。问题也是一致的。每次程序运行时都会发生这种情况。 – Mykroft 2010-01-05 20:21:23
你可能会发现这一系列的博客文章很有趣:http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx - 对编译查询进行编译直到第一次使用才会被编译。其中一个帖子应该阐明为什么这项政策存在。 – jalf 2010-01-05 20:46:21