C# SQL Azure上的查询性能较慢
我已经为我的公司建立了一个文档管理系统。桌面应用程序连接到ASP.Net Web API,作为Azure Web应用程序托管,该应用程序连接到Azure SQL数据库 随着我的数据库越来越多,它的速度开始明显减慢,因此我需要帮助进行查询优化。下面是当前导致我出现问题的Linq查询。基本上,这个查询捕获数据库中的所有项目,然后在我的桌面应用程序中填充一个列表C# SQL Azure上的查询性能较慢,c#,sql-server,linq,azure,azure-sql-database,C#,Sql Server,Linq,Azure,Azure Sql Database,我已经为我的公司建立了一个文档管理系统。桌面应用程序连接到ASP.Net Web API,作为Azure Web应用程序托管,该应用程序连接到Azure SQL数据库 随着我的数据库越来越多,它的速度开始明显减慢,因此我需要帮助进行查询优化。下面是当前导致我出现问题的Linq查询。基本上,这个查询捕获数据库中的所有项目,然后在我的桌面应用程序中填充一个列表 var projects = (from p in db.Projects.Include(c => c.ProjectTyp
var projects = (from p in db.Projects.Include(c => c.ProjectType)
select new
{
ID = p.ID,
HasSubProjects = (db.Projects.Where(u => u.ParentProjectID == p.ID).Count() > 0) ? 1 : 0,
ParentProjectID = p.ParentProjectID,
Name = p.Name,
Description = p.Description,
DateLastEdited = p.DateLastEdited,
DateCreated = p.DateCreated,
ProjectTypeID = p.ProjectTypeID,
LastEditedByGoesby = p.LastEditedByGoesby,
ProjectComponentSecurityType = p.ProjectComponentSecurityType,
ClonedFrom = p.ClonedFrom,
DateAnyVersionLastEditedByUser = p.DateAnyVersionLastEditedByUser,
DateAnyVersionLastEdited = p.UserProjectActivityLookups
.OrderByDescending(u => u.LastActivityDate)
.Select(v => v.LastActivityDate)
.FirstOrDefault(),
// p.DateAnyVersionLastEdited,,
ProjectType = p.ProjectType
}).ToList()
.Select(x2 => new Project
{
ID = x2.ID,
HasSubProjects = x2.HasSubProjects,
ParentProjectID = x2.ParentProjectID,
Name = x2.Name,
Description = x2.Description,
DateLastEdited = x2.DateLastEdited,
DateCreated = x2.DateCreated,
ProjectTypeID = x2.ProjectTypeID,
LastEditedByGoesby = x2.LastEditedByGoesby,
ProjectComponentSecurityType = x2.ProjectComponentSecurityType,
ClonedFrom = x2.ClonedFrom,
DateAnyVersionLastEditedByUser = x2.DateAnyVersionLastEditedByUser,
DateAnyVersionLastEdited = x2.DateAnyVersionLastEdited,
ProjectType = x2.ProjectType
});
;
任何关于如何优化、避免与此查询相关的问题、更好地创建索引或使用标准过程等方面的想法都会很有帮助。我在寻找关于这个特定查询的方向,同时也在寻找关于如何提高其他查询的性能以及如何继续这样做的指导
谢谢。我认为最好的方法是找出这段代码生成的sql查询。然后尝试查看sql查询的问题所在,并相应地更改linq查询 您应该寻找的一些东西:
ParentProjectID
,检查索引并尝试加入而不是子查询dateanyversionlasted
,因为查询是针对所有用户数据的。如果有大量数据和糟糕的索引,这可能会降低您的速度因此,如果您最终要检索数千条记录,请尝试通过分页或其他一些业务条件来限制计数。Azure SQL数据库有几个内置工具,可提供查询优化帮助
- 充当查询的“飞行数据记录器”,以获取有关查询计划、执行时间的数据,并查找最昂贵的查询。您可以查看上面查询的执行统计信息,看看是否存在任何明显的问题
- 分析历史资源使用情况,提供索引建议并监视索引使用情况
- 各种(DMV)如dm_exec_query_stats提供查询执行统计信息
- MSDN上的文章提供了高级性能指导信息
Srini Acharya通常的想法是向数据库询问查询计划。从那里可以很容易地发现缺少的索引。您的Azure SQL数据库服务层/性能级别是什么?它是基本的吗?你的数据库包含多少个条目?在某个时间点(或者更确切地说是DB填充级别),无论索引如何,应用程序都无法将所有内容加载到内存中。然后,您将需要在应用程序级别更改策略,例如,通过分页或按需加载列表和UI元素。@ajg-“这是基本的吗?”-而Standard并没有太好(此查询检索到多少条目?100?10000?我想问题可能出在您上面的#2中,因为有很多“版本”。我将检查此项并报告。谢谢。