一个完成的SQL语句,从发出到最后返回记录集,一共经历4个阶段:
解析:这个阶段要进行语义和语法分析、权限检查, 内容包括语句是否拼写正确、数据库对象是否存在、用户是否有
对象的访问权限,这些检查通过后,进入到下一个阶段;
优化:这一阶段是根据对象的统计信息,数据的优化器模式(CBO/RBO)来确定最佳访问路径;
产生执行计划:这一阶段根据上一阶段产生的访问路径,生成最终的执行计划;
产生结果:依据上一步的执行计划,访问数据,产生结果集,返回给用户;
备注:SQL性能调整的方法:
1. 减少解析
使用绑定变量,如果语句经过1,2,3步叫硬解析,如果使用了绑定变量,就省去了第2,3步,这种叫做软解析。
2. 访问路径
(1) 单表访问:index和全表扫描的比较
当要访问的记录数和总记录数比值<0.1%,则index访问才有意义;
当结果集和记录总数的比值>20%,一定要使用全表扫描。
当结果集和记录总数的比值在0.1%~20%之间,自行取舍。
(2) 多表连接
(A) NEST LOOP: 选择一个数据量较少的表作为驱动表,然后拿驱动表的每一条记录去和另外一张表的所有记录做一次遍历,取出符合where条件的记录。
特点: 返回第一条记录的速度非常快,不需要排序,可以用作非等值连接。
(B) SORT MERGE:对每个表进行排序,然后连个排序集进行一次遍历,取出记录集。
特点: 每个表都要排序,排序后两个表都只需要做一次遍历。
(C) HASH JOIN: 准备阶段: 驱动表的连接字段进行HASH操作,产生一系列的HASH BUCKET;
探测阶段: 被驱动表的连接字段,执行相同的HASH函数,根据结果到驱动表的HASH同种检查。
多表连接的3中连接方式的比较:
HASH JOIN算法要优于SORT MERGE算法,HASH JOIN 很类似NEST LOOP,但是由于NEST LOOP,因为HASH table是构建在PGA中的,对他的访问不需要LATCH等机制的共享保护。
HASH JOIN > NEST LOOP > SORT MERGE
参考文献:
《大话ORACLE RAC》第14章-性能与RAC