【问题标题】:Linq Query Optimization joining of tables表的Linq查询优化连接
【发布时间】:2013-05-16 14:09:50
【问题描述】:

所以我有一个 linq 查询,其中 s1.code 来自此 linq 查询之前的一个对象。

var q1 = from cf in db.Control_Franchises
         join t1 in db.Territories 
             on     SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
             equals t1.FranchiseID.Trim()
         join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID
         join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower()
         where cf.Status == "ACTIVE" 
           && cf.FranchiseID > 1000 
           && cu.UserType == "Franchisee" 
           && cu.Status == "ACTIVE" 
           && t1.Province == s1.Code
         orderby cu.LastName ascending,  cf.FranchiseID ascending
         select new
         {
             FranchiseId = cf.FranchiseID,
             Province = cf.StateCode,
             DisplayName = cu.LastName + ", " + cu.FirstName, 
             UserId = u.PK_UserID
         };

我有相同的代码块,但这次在 where 子句中,我将过滤器从使用 t1.Province == s1.Code 更改为 cf.StateCode == s1.Code

var q1 = from cf in db.Control_Franchises
         join t1 in db.Territories 
             on     SqlFunctions.StringConvert((double)cf.FranchiseID).Trim() 
             equals t1.FranchiseID.Trim()
         join cu in db.Control_Users on t1.FK_CompanyID equals cu.PrimaryCompanyID
         join u in db.Users on cu.UserID.ToLower() equals u.Username.ToLower()
         where cf.Status == "ACTIVE" 
            && cf.FranchiseID > 1000 
            && cu.UserType == "Franchisee" 
            && cu.Status == "ACTIVE" 
            && cf.StateCode == s1.Code     // DIFFERENT FROM ABOVE
         orderby cu.LastName ascending,  cf.FranchiseID ascending
         select new
         {
             FranchiseId = cf.FranchiseID,
             Province = cf.StateCode,
             DisplayName = cu.LastName + ", " + cu.FirstName, 
             UserId = u.PK_UserID
         };

现在第一个查询的运行速度是第二个查询的 10 倍。
不过,我测量速度的方式是我的编辑页面的加载时间,这反过来又加载了节点的 mvc 树视图。此查询以及其他查询的一部分。

现在我试图理解为什么我的第一个查询加载速度更快,我能想到的唯一原因是因为我正在对将要连接的表执行条件,而不是加入整个“Territories”表使用“Control_Franchises”,我只加入了“Territories”表的一部分。

有什么想法吗?

【问题讨论】:

  • 我看不出这两个查询有什么区别...有没有我遗漏的?他们甚至都被命名为q1
  • StateCodeProvince 是什么类型?两个字符串?我猜这是在检查美国与非美国地址之类的......如果是这样,第一个查询是否可能仅仅因为您的非美国条目较少而运行得更快?
  • 尝试使用Mini Profiler 查看生成的查询。
  • @DanielHilgarth 在where 中,最后一个&&d 术语不同。即将编辑以使其不需要 hscrolling 即可查看...@foop 在发布代码块时,如果可以的话,最好根据需要重新排列文本,这样生成的代码块中就没有水平滚动条。
  • @AakashM:找到那个真好。

标签: asp.net-mvc performance linq


【解决方案1】:

很可能t1.Provincecf.StateCode 这两个不同的列在基础数据源中的索引不同(或者根本没有)

【讨论】:

  • 就是这样。 感叹用现有系统继承遗留数据库的乐趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2021-12-20
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多