昨天项目反馈一个查询功能非常慢,每页显示200条明细查询时间在30秒左右。分析存储过程发现查询返回结果上百个字段,关联表有50多个,暂定原因可能是表的索引丢失。
查询的逻辑是:
1、创建临时表A,但没有创建临时表索引
2、把符合条件的订单和明细简单信息插入到临时表A,此时临时表A有数据2万条
3、返回结果条数,selec count(1) from A
4、删除不是当前页的数据,delete from a where row < start or row >end;
5、关联其他表将最终结果select 出来
分析存在的可能原因:
- 临时表A缺失索引
- 关联表中缺失索引
措施
1、根据sqlserver提供的执行计划
insert into A select into 慢,是因为此where条件后订单和订单明细缺少谓词索引,增加。
2、将临时表A增加上id和itemid对应的索引,位置放在临时表创建完毕但未插入之前
效果
不明显,查询仍然很慢
再改进
1、将临时表A的索引放在插入数据之后。
2、分析left join的关联表是否缺失索引,根据执行计划,发现某个表数据量在6万条左右,缺失主键索引,导致left join时进行了全表扫描,导致数据库服务器内存占用很高,查询慢。给这张表增加索引后,查询速度明显提升。
改进效果
查询2万条数据,时间在37秒左右。比之前效果提升明显。