如何写出高效率的sql。
什么是query plan.
query plan也有成为executionplan,就是数据库如何执行一个sql语句,具体分了几个步骤来执行。每个步骤消耗了多少cpu,时间和IO等等。通过这些统计数据,我们可以看出sql的哪个部分比较消耗时间或者内存,从而对sql语句进行调优。
query plan里面有哪些内容,笔者做了个测试。
有两张表
一张是学生的ID和分数,另外一张是学生的ID和班级,写出一条sql语句,计算出每个班级的平均值。
select avg(score),classname from student s,score c
where s.id=c.id group by classname;
在执行这条sql语句前,set autotrace on;来开启执行计划:
执行计划可以看出执行这条sql语句,数据库进行了哪几个步骤,每个步骤消耗的CPU资源和时间。
当一条sql语句提交给数据库,数据库里面发生了什么呢?
1. 语法检查,检查sql语句是否有语法错误
2,视图转换和表达式转换,将视图转换为表,将复杂的嵌套逻辑,转换为简单的直接的逻辑。
3,选择执行计划,数据库优化器生成多个执行计划,根据这些执行计划的衡量指标,数据库选择一条最优的执行。
4,将sql文本,解析的hash值,执行计划存入缓存。
平时写sql语句应该注意哪些方面呢?
1,索引的使用,如果想提高查询的效率,最好是创建一个索引。当然索引也会带来负面的效果,由于每次插入删除操作都需要重新更改index,所以使用index会降低插入的效率。
2,由于sql语句每次都需要解析,且大小写敏感,如果我们需要使用相同的sql尽量保持其写法和大小写完全一致。这样就数据库就不会再次编译了,
3,from表的顺序,由于oralce是从右到左来解析from语句的,所以将数据量小的表放在后面。因为表连接的时候会将最后的一张表扫描排序之后再从其他的表选出匹配的。
4,同样当关联多个表的时候,需要将基础表放在最后。
5,where 连接语句,由于oracle解析是从下到上的,所以过滤掉大多数的记录的条件应该写到最后,而表连接的关系语句要写在最前面。防止其全表扫描
6,避免使用*,oracle会将*解析为所有的列名。
7,减少数据库的访问次数,并使用Decode函数减少处理时间。
更多的关于sql的调优内容可参阅:http://www.chinaunix.net/old_jh/19/214182.html