关于SQL优化的几种方法介绍
说到优化,主讲会索引和分区,引导到讲索引上去,索引要好好熟悉和使用。
索引优化规则:
(1)like件中不要以通配符(wildcard)开始,否则索引将不被采用.
(2)避免在索引列上使用计算或改变索引列的类型或使用‘!=’及<>
(3)避免在索引列上使用not .
(4)用>=替代> .
高效: select * from emp where deptno>=4
低效: select * from emp where deptno>3
两者的区别在于, 前者dbms将直接跳到第一个dept等于4的记录而后者将首先定位到deptno=3的记录并且向前扫描到第一个dept大于3的记录.
(5)用union替换or (适用于索引列) 通常情况下, 用union替换where子句中的or将会起到较好的效果. 对索引列使用or将造成全表扫描. 注意, 以上只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择o规则r而降低.
(6)避免在索引列上使用is null和isnot null
避免在索引中使用任何可以为空的列,oracle将无法使用该索引.
对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中. (建议:可以给null值的字段设置一个默认值
(7)如果索引是建立在多个列上,索引时段需要放在where 条件的第一个条件(oracle8i之 前),oracle8i之后允许跳跃式索引.
(8)(可能的话)用union-all 替换union. union-all就是做简单的合并,不会进行排序,union先做简单的合并,然后做进行排序,最后去除重复的记录。
(9)避免使用耗费资源的操作
带有distinct,union,minus,intersect,order by的sql语句会启动sql引擎. 执行耗费资源的排序(sort)功能. distinct需要一次排序操作, 而其他的至少需要执行两次排序.
例如,一个union查询,其中每个查询都带有group by子句,group by会触发嵌入排序(nested sort) ; 这样, 每个查询需要执行一次排序, 然后在执行union时, 又一个唯一排序(sortunique)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.
通常, 带有union,minus , intersect的sql语句都可以用其他方式重写.
(10)用not exists 或(外连接+判断为空)方案替换not in操作符
上一篇: Golang极简入门教程(三):并发支持
下一篇: 分享一个sqlserver简单的存储过程