oracle执行计划(一)----概述

(1)什么是执行计划
SQL是一种傻瓜式语言,每一个条件就是一个需求,访问的顺序不同就形成了不同的执行计划。Oracle必须做出选择,一次只能有一种访问路径。一个访问路径就是一个执行计划。

(2)执行计划的选择
通常一条SQL有多个执行计划,那我们如何选择?那种执行开销更低,就意味着性能更好,速度更快,我们就选哪一种,这个过程叫做Oracle的解析过程,然后Oracle会把更好的执行计划放到SGA的Shared Pool里,后续再执行同样的SQL只需在Shared Pool里获取就行了,不需要再去分析。

(3)执行计划选定依据
根据统计信息来选择执行计划。

(4)统计信息
(4.1)什么是统计信息
记录数、块数等,具体查看dba_tables / dba_indexes

(4.2)Oracle如何收集统计信息
① Oracle会选择在一个特定的时间段收集表和索引的统计信息(默认周一至周五:22:00,周六周日:06:00),用户可自行调整,主要为了避开高峰期;
② 表与索引的分析有阈值限制,超过阈值才会自动进行分析。如果数据变化量不大,Oracle是不会去分析的;
③ 收集方式灵活。可针对分区表的某个分区进行,可采用并行机制来收集表和索引的信息;

(4.3)如何收集统计信息

--收集表统计信息
exec dbms_stats.gather_table_stats(ownname => 'LIJIAMAN', tabname => 'TEST02',estimate_percent => 10,method_opt => 'for all indexed columns');

--收集索引统计信息
exec dbms_stats.gather_index_stats(ownname => 'LIJIAMAN',indname => 'ID_IDX',estimate_percent => 10,degree => '4');

--同时收集表与索引的统计信息
exec dbms_stats.gather_table_stats(ownname => 'LIJIAMAN',tabname => 'TEST02',estimate_percent => 10,method_opt => 'for all indexed columns',cascade => true);

(5)动态采样
Oracle正常情况下会在每天的某段时间收集统计信息,对于新建的表,Oracl如何收集统计信息?采用动态采样。
set autotrace on
set linesize 1000
--执行SQL语句
--会出现dynamic sampling used for this statement(level=2)关键字

 

 

【完成】 

 

参考书籍:《收获,不止SQL优化》

posted @ 2019-09-08 22:10  gegeman  阅读(1875)  评论(0编辑  收藏  举报