SQL优化心得
因为一直追随着微软,所以数据库都是用的SQL Server。之前围绕SQL语句做过许多优化,有一些心得可以分享出来。
SQL优化前,需先掌握以下知识:
不要急着一上来就看执行计划加索引,先精简代码,采用最优化写法。保证SQL结构稳定后,再分析执行计划。
一、SQL
- 去掉多余字段的查询
- 复杂计算可以放在后面做,不必在取数时一次到位
- 小表关联大表,虽然inner join时sql server会自己排列匹配,但养成个好习惯吧
- 不要一次性拼大段SQL,不利于分析维护
- 能用inner join不要用left join,对于inner join,sql server会自己做过滤条件和join顺序的优化
- 减少物理表操作,过滤后放到临时表
- 少用函数,当然标量值的函数计算是可以的
- 数据更新操作不要排序,又不是查询
- 用OUTER APPLY(CROSS APPLY )代替LEFT JOIN(INNER JOIN) + GROUP BY,执行计划更简洁,代码更清晰
- 不要做多余的过滤和关联,因为这样可能导致索引无法使用
二、索引
- 关注执行计划中占比大的步骤
- 按外键和常用过滤条件加索引
- 执行计划中给出的“缺少索引”的建议,不一定适用其它上下文环境,应分析取舍
- 建索引前先查询分析已有索引,避免冗余索引
- 大数据量的表,INCLUD列不要过多,增删改会Hold不住的 。除非性能瓶颈可酌情考虑
- 不是所有非最优执行计划(聚集索引扫描等)都需要加非聚集索引替代的,考虑实际情况
- 注意索引列顺序,第1列最重要,因为“统计信息 ”是根据第1列来分析的
三、建表
- 主键不用的话,就不要用有序GUID了,批量插入很慢的
- 建表时就加上索引,特别是外键索引,不要再亡羊补牢了