SqlServer索引假脱机的解决
今天产品提出平台打开某一个模块速度特别慢,甚至有时会出现504的错误。赶紧连接正式版数据库本地调试代码,发现进行数据获取时,打开数据库和关闭数据库中间间隔的时间有5秒之久,这是数据量较少的情况,如果数据量更大的话就有可能出现错误了。看来问题是出在sql语句这里,把sql语句拷贝出来放到查询分析器中进行查看,速度还是很快的,但是查看执行计划的时候发现了问题,有3个索引假脱机的提示,并且开销都很大。
以前没注意过这个索引假脱机,赶紧去百度了一下。看别人说的有点绕,总结起来就是索引缺失引起的,尤其是在使用一些复杂查询的时候。以我们平台的这个模块为例,当前是要查询所有我发布的,需要我审批的以及我审批通过的。查询条件如下
a.UserId=#UserId# or EXISTS(SELECT AskForLeaveAuditId FROM dbo.AskForLeaveAudit where AskForLeaveAudit.AskForLeaveId=a.AskForLeaveId and UserId=#UserId#) or EXISTS(SELECT AuditAskForLeaveId FROM dbo.AuditAskForLeave where AuditAskForLeave.AskForLeaveId=a.AskForLeaveId and AuditUserId=#UserId#
我给AskForLeaveAudit表增加了一个AskForLeaveId和UserId的聚合索引,又给AuditAskForLeave表增加了一个AskForLeaveId和AuditUserId的聚合索引。再进行测试的时候速度就有了很大提升。
其实我觉得想根本上解决问题还是应该把业务逻辑分开,比如分成几个模块,只是查看我发布的,需要我审批的,以及我审批通过的,这样业务逻辑相对简单,效率上可以有更好的表现。当然这个是业务决定的,我们还是要能解决这些问题才行。