很久没搞sqlserver了,接了一个项目是sqlserver要提高查询效率,首选索引添加以及优化,中间遇到些问题,记录如下
首先使用sqlserver managent studio进行sql的效率分析以及执行计划的查看,如果性能严重,会提示如何创建索引
一、聚集索引和非聚集索引问题
项目中很多都是需要时间段查询类似于 create_time >= ? and create_time <= ? 等,所以毫不犹豫在在create_time上增加索引,create index idx_XXX_xxx on table xxxxx,
查看了很多SQL语句,原先很多都是用 CONVERT函数做了个转换,果断全部去掉,但是发现虽然查询有提升但是并不多呢,所以查资料发现这种时间段的查询适合聚集索引,于是增加聚集索引但是系统提示Pk_xxxx聚集索引已经存在,于是先删除主键,再给create_time增加聚集索引,然后再加上主键,果然提升很多
关于聚集索引和非聚集索使用场景,可参考https://blog.youkuaiyun.com/weixin_39857153/article/details/111382169 中的表格
二、key lookup 问题
键查找是因为查询返回的结果列中有非索引的列,这种有两种方式解决:
1、增加覆盖索引,覆盖所有列
2、使用include索引,包含所有列
因为我这边的列不多所以我直接include了,
这边有个不确定的问题:
如果结果列很多,使用覆盖索引或include是否会影响增、删改的性能呢?
三、index scan 问题
索引扫描分为聚集和非聚集两种,索引扫描比表扫描性能搞,但是不如索引查找,
所以遇到索引扫描问题需要想办法修改成索引查找
索引查找的定义:条件中包含WHERE或者ON的话,查询条件必须是位于索引集合列中首位,此时索引查找将会被使用。
关于这块可参考: https://www.cnblogs.com/CreateMyself/p/6117352.html
四、多个left join问题
项目中有几个地方是分页展示,展示的数据需要left join几个百万级的数据表
这种情况下,因为是分页展示,那么考虑去掉left join 查询出来的分页数据后直接循环
查询几张表,在查询条件上加上索引,这样会比较快点
未完待续.....................