Sql 优化linq查询以提高性能(现在需要12-15秒,需要3秒)

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

编辑:我需要帮助将这些linq查询重写为SQL查询,以获得尽可能高的性能

我有一张大约1000万行的桌子。它由包括Id在内的7列组成。首先是Id,然后是“TradeObjectModel”的三个键,最后是三个保留不同TradeObjectModels评级值的整数。这样地:

当一个用户,例如键为71的ToId(TradeObjectModel1所有者)处理她对其他交易对象的评级时,当前视图只有一行就足够了

我试图解决这个问题,如下所示(代码示例下面的解释):

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);
                }
            }