oracle性能调优-执行计划
来源:互联网 发布:网络药理学会议 编辑:程序博客网 时间:2024/05/29 17:06
这几天跑存储过程,有时间一跑就是几十分钟,等的确实有点辛苦;于是就想研究一下sql执行的性能,看看存储过程执行慢的问题出在什么地方。
要进行oracle性能调优,不用多说,第一步肯定是看执行计划,要是执行计划看不懂,那就直接歇菜了。
下面就简单的介绍一执行计划的基本概念,方便上手。
一、查看执行计划的方式
查看执行计划一般有三种方式:
1、设置autotrace,设置之后,执行sql就会显示执行计划
2、使用sql(这一种感觉用的比较多)
EXPLAIN PLAN FOR SQL语句
select * from table(dbms_xplan.display);
例如:
SQL> EXPLAIN PLAN FOR select * from test;ExplainedSQL> select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------Plan hash value: 1357081020--------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 4 | 216 | 3 (0)| 00:00:01 || 1 | TABLE ACCESS FULL| TEST | 4 | 216 | 3 (0)| 00:00:01 |--------------------------------------------------------------------------Note----- - dynamic sampling used for this statement (level=2)12 rows selected
3、通过工具(比较方便)
可以用pl/sql或者Toad
a、pl/sql 执行完语句后直接按F5就可以了,如下:
b、Toad 在Toad 里面,很清楚的显示了执行的顺序:
二、执行计划解读
先看一个比较标准的执行计划:
执行计划----------------------------------------------------------Plan hash value: 992080948---------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 13 | 988 | 6 (17)| 00:00:01 || 1 | MERGE JOIN | | 13 | 988 | 6 (17)| 00:00:01 || 2 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 532 | 2 (0)| 00:00:01 || 3 | INDEX FULL SCAN | PK_EMP | 14 | | 1 (0)| 00:00:01 ||* 4 | SORT JOIN | | 13 | 494 | 4 (25)| 00:00:01 ||* 5 | TABLE ACCESS FULL | EMP | 13 | 494 | 3 (0)| 00:00:01 |---------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 4 - access("A"."EMPNO"="B"."MGR") filter("A"."EMPNO"="B"."MGR") 5 - filter("B"."MGR" IS NOT NULL)统计信息---------------------------------------------------------- 0 recursive calls 0 db block gets 11 consistent gets 0 physical reads 0 redo size 2091 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 13 rows processed
下面就来介绍执行计划中的字段到底是什么意思
a、普通字段解释
b、谓词解释
Access: 表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。
Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。
c、统计信息说明
Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增 加相关的索引,优化SQL语句来解决。
关于physical reads ,db block gets 和consistent gets这三个参数之间有一个换算公式:
数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。
用以下语句可以查看数据缓冲区的命中率:
SQL>SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets','physical reads');
查询出来的结果Buffer Cache的命中率应该在90%以上,否则需要增加数据缓冲区的大小。
d、动态分析
在开始的文章开始的执行计划中,会看到下面这个动态分析:
Note----- - dynamic sampling used for this statement (level=2)12 rows selected
这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析。
三、性能优化的几个方面
查看了执行计划之后,我们根据问题要进行sql优化,下面是一些优化常见的方面:
a、表访问方式
b、表连接方式
c、运算符
ok,这里对oracle进行了一个简单的介绍,简单实用。
参考文档:http://blog.chinaunix.net/uid-21187846-id-3022916.html
- oracle性能调优-执行计划
- ORACLE性能调优之执行计划的使用
- oracle笔记整理14——性能调优之oracle执行计划
- 性能调优第二篇-执行计划
- 性能调优分析之:Oracle SQL执行计划报告生成器
- Oracle性能优化-读懂执行计划
- Oracle性能优化-读懂执行计划
- Oracle性能优化-读懂执行计划
- Oracle性能优化-读懂执行计划
- Oracle性能优化-读懂执行计划
- oracle 执行计划的初试 利用Oracle执行计划机制提高查询性能
- 数据库性能调优技术─嵌套循环执行计划
- 性能调优第三篇-执行计划常见操作符
- 利用Oracle执行计划机制提高查询性能
- 利用Oracle执行计划机制提高查询性能
- 利用Oracle执行计划机制提高查询性能
- 利用Oracle执行计划机制提高查询性能
- 利用Oracle执行计划机制提高查询性能
- sar 命令详解
- VirtualAlloc和VirtualCopy的蕴含知识点
- String、StringBuffer、StringBuilder的区别
- 计算机网络: 同步传输和异步传输(理解)
- [疯狂Java]JDBC:数据库元数据分析
- oracle性能调优-执行计划
- 初始化job,并分析svn日志--initNEW1-UFT.bat
- 从尾到头打印链表
- 学习笔记之深入浅出MFC 第4章 对话框的运行
- Windows系统下IE单双多进程分析
- Coursera Chaptereight:Lists Assignment 8.5
- Java 自定义异常类
- iOS开发之指定UIView的某几个角为圆角
- Java enum的用法详解