【问题标题】:Improve LINQ query performance?提高 LINQ 查询性能?
【发布时间】:2013-10-18 07:47:19
【问题描述】:
public List<Agents_main_view_distinct> getActiveAgents(DateTime start, DateTime end)
    {
       myactiveagents = null;            
       myactiveagents = mydb.Agents_main_view_distincts.Where(u => u.Status.Equals("Existing") && u.DateJoined2 >=start && u.DateJoined2 <=end).OrderByDescending(ac => ac.Recno).ToList();            
       return myactiveagents;
     }

我有一个查询视图的简单 LINQ 查询。我担心的是它的性能。它适用于数百条记录,但当记录超过 2000 条时。SQL 服务器超时。
我为提高性能所做的事情。
1.写了一个查询直接查询表(没有改进)。
2. 减少不必要的列,之前是27列,现在减少到20列。

在绝望的尝试中,我将服务器超时时间增加到 600。但它仍然超时。

查看SQL查询

SELECT dbo.Agents.Recno, dbo.Agents.Rec_date, dbo.Agents.AgentsId, dbo.Agents.AgentsName, dbo.Agents.Industry_status, dbo.Agents.DOB, dbo.Agents.Branch, 
                  dbo.Agents.MobileNumber, dbo.Agents.MaritalStatus, dbo.Agents.PIN, dbo.Agents.Gender, dbo.Agents.Email, dbo.Agents.ProvisionalLicense, 
                  dbo.Agents.IRALicenseNumber, dbo.Agents.PreviousCompany, dbo.Agents.YearsOfExperience, dbo.Agents.COPNumber, dbo.Agents.DateJoined AS DateJoined2, 
                  dbo.Agents.DateJoined, dbo.Agents.PreviousOccupation, dbo.Agents.ProffesionalQualification, dbo.Agents.EducationalQualification, dbo.Agents.Status, 
                  dbo.Agents.Termination_Date2 AS Termination_Date, dbo.Agents.Comments, dbo.Agents.Temination_code, dbo.Agents.Company_ID, dbo.Agents.Submit_By, 
                  dbo.Agents.PassportPhoto, dbo.Insurane_Companies.Company_name, DATEDIFF(year, dbo.Agents.DOB, GETDATE()) AS age, YEAR(dbo.Agents.DateJoined) 
                  AS YearJoined, YEAR(dbo.Agents.Termination_Date2) AS YearTermination, dbo.Agents.REGION, dbo.Agents.DOB AS DOB2, 
                  dbo.Insurane_Companies.Company_code
     FROM         dbo.Agents INNER JOIN
                  dbo.Insurane_Companies ON dbo.Agents.Company_ID = dbo.Insurane_Companies.Company_id

【问题讨论】:

  • 你考虑过索引你的数据库吗?此外,由于您是从视图中获取,您可以考虑优化视图本身。
  • 您可以发布视图本身的 SQL 代码吗?
  • 你试过使用存储过程吗?
  • 两千条记录并不是一个大集合。我认为问题可能出在数据本身。尝试在 SSMS 中进行此查询并查看执行计划,这可能会提供一些线索。
  • @jyparask 是的,我已经索引了数据库。

标签: c# sql sql-server linq


【解决方案1】:

您可以尝试将WhereOrderBy 子句移动到视图本身,必要时通过使用存储过程/用户定义函数来传递参数。

您也可以将Glimpse 添加到您的项目中。除此之外,您还可以检查 SQL 调用以查看是否有任何不必要或耗时的数据库命中。

【讨论】:

  • 再一次感谢,至少这已经缓解了一段时间。
【解决方案2】:

正如 James 所建议的,最好创建一个存储过程并通过 LINQ 调用它,并传递任何必要的参数。这样,服务器将处理应该更快的处理,因为查询不必转换回 SQL 来处理。除此之外,您可以使用 SQL 的 Query Analyzer 或 Profiler 查看瓶颈可能是什么。

【讨论】:

  • 喜欢同样的问题,当查询看起来是静态的时,存储过程是最好的。
  • 我会试一试并尽快提供反馈。
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多