oracle 之使⽤OracleDeveloper 对SQL 进⾏简单调优(⼆)
使⽤Oracle Developer 对SQL 进⾏简单进⾏简单调优调优
Oracle Developer 是Oracle 提供的免费数据库连接⼯具,⾏内数据中⼼⽣产操作间默认使⽤该⼯具执⾏SQL ,如遇到现场需要对⽣产SQL 进⾏优化查询的需要熟悉Oracle Developer 的基本使⽤,本⽂结合Oracle Developer ⼯具展⽰如何查看SQL ,如果进⾏基本优化。⼀、 Oracle Developer 和 Oracle 命令
1. Oracle Developer
SQL 解释
Oracle Developer ⼯具⾥⾯的“解释”功能只针对当前的sql 进⾏了⼀个预估的资源消耗以及执⾏路径,参考数据是系统⾥存在的表统计信息。结果显⽰与实际执⾏可能存在差异,且表的详细信息,在其它功能下显⽰更为详细。
SQL 优化指导
Oracle Developer ⼯具⾥⾯的sql 优化指导功能,对要优化分析的sql 进⾏了真实的执⾏,该功能展⽰的结果,包含了部分解释功能的结果,也就是根据表⾥⾯的统计信息预估的执⾏计划;它⼀般还包含优化建议;另外还展⽰了该sql 的实际执⾏计划和并⾏执⾏时的sql 性能结果。
SQL 跟踪
Oracle Developer ⼯具⾥⾯的sql 跟踪功能,对要优化分析的sql 进⾏了实际的执⾏,详细的展⽰了执⾏过程中对 索引 CPU 缓存IO 和块的改变情况,也列出了执⾏过程中涉及的数据量和资源消耗;此功能包含了sql 解释中的表统计信息。
2. Oracle 命令
autotrace
Oracle 命令 autotrace 是分析sql 的真实执⾏计划,查看sql 执⾏效率的⼀个⽐较简单⼜⽅便的⼯具。它实际上是对sql 实际执⾏过程信息的⼀个收集和信息统计。
set autotrace on 开启autotrace ,后⾯执⾏sql 语句会⾃动显⽰sql 执⾏结果和跟踪信息。
set auto traceonly; 仅显⽰跟踪信息。
set auto on explain; 仅显⽰跟踪的explain 信息。
set auto on statistics 仅显⽰跟踪的统计信息。
set autotrace off 关闭跟踪。
explain plan for
Oracle 命令explain 查看执⾏计划时oracle 没有真实执⾏sql 语句。所以⽣成的执⾏计划未必是真实的,⽽且还必须借助plan_table 才能看到详细信息,具体使⽤⽅式如下:
explain plan for + select * from table where ...
select * from TABLE(DBMS_XPLAN.DISPLAY);
⼆、 表扫的SQL
1. 解释计划
在查询界⾯选中⼀条sql ,按F10,或者右键点击解释选项,出现该sql 的解释计划:
此处显⽰Oracle估算后给出的解释计划:
双击表名打开表的详细统计信息,此部分提供了表的数据,约束条件,字段定义类型,索引,分区等详细信息。
注意:预估的解释计划和实际的执⾏计划可能不相同,预估的解释计划是oracle根据最新的统计信息产⽣的执⾏计划,实际sql执⾏时oracle会根据当时系统的负载情况(可能不是最新的统计信息),涉及的数据量,是否有绑定变量,有没有物理读等信息,通过优化器进⾏的执⾏策略选择。所以采⽤dbms_xplan.display_cursor(sql_id,child_number,format)函数查看实际的sql执⾏计划;通过查看预估的执⾏计划确定统计信息的新旧。
2. SQL优化指导
选中sql点击右键,选中优化指导,出现执⾏计划信息
优化指导内容解析,基本信息区域:
优化建议区域:当Oracle分析执⾏的SQL后发现有更优的解释计划时会在优化建议区给出提⽰:
解释计划区域,hash值与解释计划⾥⾯的⼀样,该部分显⽰包括了解释计划的信息:
推荐的sql优化修改,该信息可以作为参考,本⽰例种给出的优化⽅案是开启sql的并⾏:
sql语句优化方式
PX COORDINATOR 并⾏执⾏协调者,属于并⾏执⾏的第⼀步,负责并⾏语句的初始化,且将并⾏操作分解,按照⼀定策略将分解后的⼦任务下发给并⾏服务会话。
PX SEND QC(RANDOM)并⾏服务进程通过表队列将数据随机发给协调者
PX BLOCK ITERATOR 并⾏颗粒度,block iterator把表分割成多个块,每个块由涉及的并⾏服务进程中的⼀个去处理。它常和TABLE ACCESS FULL成对出现,意味着全表扫描。
TABLE ACCESS FULL 全表扫描
3. 真实的执⾏计划
使⽤autotrace(注意,autotrace traceonly后的sql会被真实执⾏,如果不想执⾏请⽤explain plan for)查询sql实际执⾏计划与解释计划结果⼀致:
Recursive calls :执⾏该条语句时,对其他sql语句的调⽤次数,这种调⽤包含对该⽤户下的sql或者是系统的sql。
db block gets:Number of times a CURRENT block was requested. (non consistent gets)⾮⼀致性读,当前SQL执⾏时点获取的块数,从数据缓冲区中读取。
consistent gets:Number of times a consistent read was requested for a block.⼀致性读,为了保证数据⼀致性,在数据缓冲区包括回滚段中读取的数据块。
physical reads:物理读,从磁盘上读取的数据块。
逻辑读指的是从数据缓冲区(内存)中读到的数据块,由于从内存读取,因此相对于从磁盘读取要快的多。
逻辑读 = db block gets+ consistent gets
查询命中率需要的数据:select name,value from v$sysstat where name in ('db block gets','consistent gets','physical reads');
命中率=1-(physical reads/(db block gets+ consistent gets))
Redo size:执⾏DML语句产⽣的重做⽇志⼤⼩
Sorts(memory,disk)在内存或者磁盘中的排序的数量。
注意:以上信息我们关注的主要是物理读和命中率,物理读过多说明从磁盘获取的数据就多,可能存
在全表扫描,使得数据库的性能下降。命中率过低意味1、物理读过多;2、数据缓冲区设置过⼩,此时需要确认缓冲区合理⼤⼩,该值⼀般在90%以上。
三、⾛索引的SQL
1. 解释计划
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论