Sql 优化linq查询以提高性能(现在需要12-15秒,需要3秒)
编辑:我需要帮助将这些linq查询重写为SQL查询,以获得尽可能高的性能 我有一张大约1000万行的桌子。它由包括Id在内的7列组成。首先是Id,然后是“TradeObjectModel”的三个键,最后是三个保留不同TradeObjectModels评级值的整数。这样地: 当一个用户,例如键为71的ToId(TradeObjectModel1所有者)处理她对其他交易对象的评级时,当前视图只有一行就足够了 我试图解决这个问题,如下所示(代码示例下面的解释):Sql 优化linq查询以提高性能(现在需要12-15秒,需要3秒),sql,performance,tsql,linq-to-entities,query-optimization,Sql,Performance,Tsql,Linq To Entities,Query Optimization,编辑:我需要帮助将这些linq查询重写为SQL查询,以获得尽可能高的性能 我有一张大约1000万行的桌子。它由包括Id在内的7列组成。首先是Id,然后是“TradeObjectModel”的三个键,最后是三个保留不同TradeObjectModels评级值的整数。这样地: 当一个用户,例如键为71的ToId(TradeObjectModel1所有者)处理她对其他交易对象的评级时,当前视图只有一行就足够了 我试图解决这个问题,如下所示(代码示例下面的解释): IEnumerable allTri
IEnumerable allTriangleModels1=
这个._ratingListTriangleRepository.All.Where(
ratingListRow=>
ratingListRow.toId==myTradeObject.TradeObjectId);
var filteredallTriangleModels1=来自allTriangleModels1中的行
将row.To2Id按行分组到g中
选择g.First();
IEnumerable allTriangleModels2=
这个._ratingListTriangleRepository.All.Where(
ratingListRow=>
ratingListRow.To2Id==myTradeObject.TradeObjectId);
var filteredallTriangleModels2=来自allTriangleModels2中的行
将row.To3Id按行分组到g中
选择g.First()。
IEnumerable allTriangleModels3=
这个._ratingListTriangleRepository.All.Where(
ratingListRow=>
ratingListRow.To3Id==myTradeObject.TradeObjectId);
var filteredallTriangleModels3=来自allTriangleModels3中的行
将row.toid按行分组到g中
选择g.First();
var fileredallTriangleModels=
filteredalltriangelmodels1.Union(filteredalltriangelmodels2.Union(filteredalltriangelmodels3.ToList();
ViewBag.TriangleCount=fileredallTriangleModels.Count();
foreach(fileredallTriangleModels中的var ratingListRow)
{
//找到哪一个是我的广告,并将我设置为setter,将他们的对象设置为receiver
if(ratingListRow.ToId==customer.TradeObjectId)
{
var ri=新的三角形视图模型(
customer.TradeObjectId,
此.\u customerRepository.FindTradeObjectId(ratingListRow.To2Id),
ratingListRow,
这个.u tradeobjectRepository.Find(ratingListRow.To2Id));
model.Models3.Add(ri);
继续;
}
if(ratingListRow.To2Id==customer.TradeObjectId)
{
var ri=新的三角形视图模型(
customer.TradeObjectId,
此.\u customerRepository.FindTradeObjectId(ratingListRow.To3Id),
ratingListRow,
这个.u tradeobjectRepository.Find(ratingListRow.To3Id));
model.Models3.Add(ri);
继续;
}
if(ratingListRow.To3Id==customer.TradeObjectId)
{
var ri=新的三角形视图模型(
customer.TradeObjectId,
此.\u customerRepository.FindTradeObjectId(ratingListRow.ToId),
ratingListRow,
这个.u tradeobjectRepository.Find(ratingListRow.toaid));
model.Models3.Add(ri);
}
}
首先,我获取我的对象位于第一列的所有行,将它们分组以仅选择一个,然后继续在第二列和第三列对我执行相同的操作。这里的ToList()对于med来说只是临时的,它可以在上面运行秒表,每一个都需要0-12秒。然后我加入它们并运行它们,以创建webgrid在前端代码中使用的模型
这导致了两个问题:1。这需要很长时间。二,。如果我的tradeobject id位于多个列上,我将得到多个行,显示我感兴趣的tradeobject的多个对象 尝试使用查看添加/删除/更改表上的索引是否能显著提高LINQ查询呈现的工作负载的性能。尝试使用探查器捕获查询,并分离运行时间最长的前三个查询。将它们复制到SSM中并执行它们。寻找实际的执行计划。查找表扫描或估计记录计数与实际记录计数之间的巨大差异。从这里,要么统计数据被关闭,要么您可以考虑设置一个索引来覆盖查询。 < P>从性能的角度来看,使用某种存储过程可能更好。LINQ倾向于通过这些类型的查询/查找来降低速度。但是,如果存储过程还不够,您可以做一些事情 首先,您可能想看一看,它基本上是通过保持搜索进行或在给定的时间内“推迟”执行来编写的。这应该适用于任何IEnumerable 我建议的下一件事是,看看您是否可以潜在地集成类似于上面的增量搜索的东西(通过使用Add函数等),以便为您的程序中使用的任何东西创建类似的实现
不过说真的-我在过去看到了存储过程的巨大改进,这肯定会提高速度(在我的例子中,一个查询几乎减少了10倍!)如果存储库来自远程源,一个优化就是删除
.ToList()
对单个列表的调用,并将其应用于union
@MagnusKarlsson,因为它们很可能会影响您的绩效。Li
IEnumerable<RatingListTriangleModel> allTriangleModels1 =
this._ratingListTriangleRepository.All.Where(
ratingListRow =>
ratingListRow.To1Id == myTradeObject.TradeObjectId);
var filteredallTriangleModels1 = from row in allTriangleModels1
group row by row.To2Id into g
select g.First();
IEnumerable<RatingListTriangleModel> allTriangleModels2 =
this._ratingListTriangleRepository.All.Where(
ratingListRow =>
ratingListRow.To2Id == myTradeObject.TradeObjectId);
var filteredallTriangleModels2 = from row in allTriangleModels2
group row by row.To3Id into g
select g.First().
IEnumerable<RatingListTriangleModel> allTriangleModels3 =
this._ratingListTriangleRepository.All.Where(
ratingListRow =>
ratingListRow.To3Id == myTradeObject.TradeObjectId);
var filteredallTriangleModels3 = from row in allTriangleModels3
group row by row.To1Id into g
select g.First();
var fileredallTriangleModels =
filteredallTriangleModels1.Union(filteredallTriangleModels2).Union(filteredallTriangleModels3).ToList();
ViewBag.TriangleCount = fileredallTriangleModels.Count();
foreach (var ratingListRow in fileredallTriangleModels)
{
//Find which one is my ad and set me as setter and their object as receiver
if (ratingListRow.To1Id == customer.TradeObjectId)
{
var ri = new TriangleViewModel(
customer.TradeObjectId,
this._customerRepository.FindTradeObjectId(ratingListRow.To2Id),
ratingListRow,
this._tradeobjectRepository.Find(ratingListRow.To2Id));
model.Models3.Add(ri);
continue;
}
if (ratingListRow.To2Id == customer.TradeObjectId)
{
var ri = new TriangleViewModel(
customer.TradeObjectId,
this._customerRepository.FindTradeObjectId(ratingListRow.To3Id),
ratingListRow,
this._tradeobjectRepository.Find(ratingListRow.To3Id));
model.Models3.Add(ri);
continue;
}
if (ratingListRow.To3Id == customer.TradeObjectId)
{
var ri = new TriangleViewModel(
customer.TradeObjectId,
this._customerRepository.FindTradeObjectId(ratingListRow.To1Id),
ratingListRow,
this._tradeobjectRepository.Find(ratingListRow.To1Id));
model.Models3.Add(ri);
}
}