[英]Parametrized Linq to SQL query causes performance issues
我有一个linq查询需要11分钟来执行对MSSQL服务器2008.我使用MSSQL Profiler查找执行这么长时间的查询,我单独运行到我的数据库。
我还删除了所有参数并直接添加了值并运行查询。 执行时间不到1秒!
我用google搜索并发现使用参数确实会影响性能,因为计划是在where子句的值已知之前编译的 。
由于Linq to SQL总是运行参数化SQL,在这种情况下我可以做些什么来提高性能?
我没有找到任何关于索引的列可以改进的东西。 Inner Join语句中的第一个表有192 014行,没有参数的SQL只需不到一秒的时间来执行。 附加执行计划的屏幕截图。
编辑位于屏幕截图下方。
这是Linq查询:
var criteria = CreateBaseCriteria();
var wordsGroup = from word in QueryExecutor.GetSearchWords()
join searchEntry in QueryExecutor.GetReportData(criteria) on (word.SearchID + 100000000) equals searchEntry.EventId
group searchEntry by word.SearchWord into wg
select new SearchAggregate
{
Value = wg.Key,
FirstTime = wg.Min(l => l.EventTime),
LastTime = wg.Max(l => l.EventTime),
AverageHits = wg.Average(l => l.NumberOfHits.HasValue ? l.NumberOfHits.Value : 0),
Count = wg.Count()
};
return wordsGroup.OrderByDescending(w => w.Count).Take(maxRows);
编辑:截图在这里确实有点小。 参数化SQL中只有5个参数。
编辑2:它是带参数@ p0的内部连接语句,它导致执行计划发生变化。 当我只用值本身删除@ p0变量时,它运行的时间少于一秒。 如果这个值在所有情况下都是常量(我必须调查),我可以做任何事情,以便这个值不会像参数一样被使用吗?
建议您在查询计划上方创建绿色索引。 先试试这个。
我找到了解决这个问题的方法,这导致执行时间增长很快:
on (word.SearchID + 100000000) equals searchEntry.EventId
我做的是添加一个计算列 [SearchIdUnique] AS([SearchID] +(100000000))。 然后我可以将我的Linq查询更改为:
on word.SearchIdUnique equals searchEntry.EventId
查询执行时间不到一秒,问题就解决了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.