繁体   English   中英

参数化Linq到SQL查询会导致性能问题

[英]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);

带参数的查询执行计划(linq to sql)具有已知值的查询的执行计划

编辑:截图在这里确实有点小。 参数化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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM