关于Oracle程序块(主要为sql)优化方法小结
Posted Wind_LPH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Oracle程序块(主要为sql)优化方法小结相关的知识,希望对你有一定的参考价值。
Oracle优化本身就是一件难度比较大的事情,所涉及的事情方方面面。下面说一下我的优化经验(仅限于初学者使用):
很多书上说的优化经验,都包括索引、表结构、标量子查询以及数据库层面的优化,但是80%的优化都可以是语句级的优化。优化的对象包括:procedure、function及Sql。
对于对Oracle数据库很熟悉的人来说,优化基本不需要借助任何工具就可以做到。但下面我说两个工具用来进行Sql优化:dbms_profile和advisor两个工具。
当然也可以通过执行计划进行优化。
最后会简单阐述ADDM报告需要重点关注的几个地方。
1、dbms_profile这个工具在10g之前是没有安装的,需要手动执行$ORACLE_HOME/rdbms/admin/proftab.sql进行初始化。这个工具是用来收集procedure和function基于每条语句的所花费的时间,是概数。
2、advisor工具是针对每条sql语句,通过Oracle内置的优化器给出优化建议。
那么对于两个工具可以配合使用,使用dbms_profile进行对象过程语句的筛选,通过advisior进行语句级的优化。
一、dbms_profile的使用先不进行说明,以后详解。
二、advisior使用举例
1)定义task任务
declare
my_task_name varchar2(30);
my_sqltext clob;
begin
my_sqltext:=\'select a.*,b.deptno from emp a,dept b where a.deptno=b.deptno\';
my_task_name:=dbms_sqltune.create_tuning_task
(sql_text => my_sqltext, ---优化的语句
user_name => \'SCOTT\', ---优化的所在用户
scope => \'COMPREHENSIVE\', ---优化范围(COMPREHENSIVE或者limited)
time_limit => 60, ---优化的时间限制
task_name => \'tuning_sql_text\', ---任务名称
description => \'task to\'); ---任务描述
end;
2)执行任务进行优化分析
begin dbms_sqltune.execute_tuning_task(\'tuning_sql_text\'); end;
3)查看是否已经得到结果
select * from user_advisor_tasks where task_name=\'tuning_sql_text\';
4)查看优化结果
select dbms_sqltune.report_tuning_task(\'tuning_sql_text\') from dual;
下面结果优化得到的结果,由于语句比较简单,所以优化器没有给出结果。
三、ADDM报告简单说明
1)生成addm报告
有两种方法,一是通过em工具生成;二是通过命令生成addm报告。以下是通过em工具生成的报告。
得到的结果如下图:
2)优化需要考虑的几点是 a、Memory Target, b、I/O, c、Wait stats,在ADDM报告中就是如下几点
需要观测的是值异常的一些。
四、使用执行计划进行优化
可以使用执行计划进行sql的优化,方法有很多。可以通过dbms_xplan、plsql里的计划或者cmd中的set autotrace on等。
使用执行计划进行sql优化需要了解的知识比较多:
1)了解位图索引、哈希索引和b树索引的区别及应用范围
2)当然范围分区、散列分区、列表分区以及复杂的复合分区特点
3)sql语句解析顺序、对索引的解析范围
4)对hint的了解及应用
5)表中列索引的建立和索引空间和数据空间的规划等
才可以通过执行计划对sql进行更好地优化。
优化是一个非常复杂但同样又是一件比较简单的事情,其中涉及到的知识非常多,本文只是简单列举了常用的几项优化方法,对于sql优化有时候是需要根据经验进行优化的。
仅供参考。
本文原创,禁止转载!
以上是关于关于Oracle程序块(主要为sql)优化方法小结的主要内容,如果未能解决你的问题,请参考以下文章