如何优化PL/SQL

(Walter Fan Fetched from Oracle 9i performance Tuning Tips & Techniques Richard J.Niemiec)
1. 利用DBMS_APPLICATION_INFO进行实时监控
DECLARE
 lv_count_num PLS_INTEGER:=0;
 lv_start_time_num PLS_INTEGER;
BEGIN

2.在数据库表中记录计时信息

3.减少PL/SQL程序的单元迭代和迭代时间

4.使用 ROWID进行迭代处理

5.将数据类型,IF语句的排列和PLS_INTEGER标准化
--确保比较运算中的数据类型相同
--根据条件出现的频率来排序IF条件
--使用PLS_INTEGER PL/SQL数据类型进行整数运算

6.减少对SYSDATE的调用

7.减少对MOD函数的调用

8.在共享池中预载对象

9.标识需要加载的PL/SQL对象

10.使用和修改DBMS_SHARED_POOL.SIZES

11. 从DBA_OBJECT_SIZE中获取详细的信息

12. 发现无效的对象
col "Owner" format a12
col "Object" format a20
col "OType" format a12
col "Change Date" format a20
SELECT SUBSTR(owner,1,12) "Owner",
 SUBSTR(object_name,1,20) "Object" ,
 object_type "OType",
 TO_CHAR(last_ddl_time,'DD-MON-YYYY HH24:MI:SS') "Change Date"
 FROM dba_objects
 WHERE status<>'VALID'
 ORDER BY 1,2

 重新编译所有的存储过程,函数和程序包
 begin
 dbms_utility.compile_schema('GW');
 end;

13. 发现已禁用的触发器

14. 将PL/SQL作为快速参考表查询

15.查找和调整所使用对象的SQL

16.在处理DATE数据类型时使用时间信息

17.调整和测试PL/SQL

18.了解PL/SQL对象定位的含义

19.使用回滚段打开大型游标

20. 使用临时表来提高性能

21.集成用户跟踪机制以定位执行位置

22.限制动态SQL的使用

23.简单示例

查询索引
select table_name, index_name,column_name,column_position
from dba_ind_columns
where table_name='XXX'
and table_owner='XXX'
order by index_name,column_position

在v$sqlarea中找出最占资源的查询
SELECT b.username username,a.disk_reads READS,
a.executions EXEC,
a.disk_reads/DECODE(a.executions,0,1,a.executions) rds_exec_ratio,
a.sql_text statement
FROM v$sqlarea a,dba_users b
WHERE a.parsing_user_id=b.user_id
AND a.disk_reads>100000
ORDER BY a.disk_reads DESC

在v$sql中找出最占资源的查询
SELECT * FROM (
 SELECT sql_text,rank() OVER(ORDER BY buffer_gets DESC) AS rank_bufgets,
 TO_CHAR(100*ratio_to_report(buffer_gets) OVER(), '999.99') pct_bufgets
 FROM v$sql)
 WHERE rank_bufgets<11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 前言 5 1.1 目的 5 1.2 文档说明 5 1.3 词汇表 5 1.4 参考资料 5 2. PLSQL程序优化原则 6 2.1 导致性能问题的内在原因 6 2.2 PLSQL优化的核心思想 6 2.3 ORACLE优化器 6 2.4 PLSQL优化 7 2.4.1 选择最有效率的表名顺序 7 2.4.2 WHERE子句中的连接顺序 8 2.4.3 SELECT子句中避免使用 ‘ * ‘ 8 2.4.4 用EXISTS替代IN 8 2.4.5 用NOT EXISTS替代NOT IN 9 2.4.6 用表连接替换EXISTS 9 2.4.7 用EXISTS替换DISTINCT 10 2.4.8 减少对表的查询 10 2.4.9 避免循环(游标)里面嵌查询 11 2.4.10 尽量用union all替换union 13 2.4.11 使用DECODE函数来减少处理时间 13 2.4.12 group by优化 13 2.4.13 尽量避免用order by 14 2.4.14 用Where子句替换HAVING子句 14 2.4.15 使用表的别名(Alias) 14 2.4.16 删除重复记录 14 2.4.17 COMMIT使用 15 2.4.18 减少多表关联 15 2.4.19 批量数据插入 15 2.5 索引使用优化 16 2.5.1 避免在索引列上使用函数或运算 16 2.5.2 避免改变索引列的类型. 17 2.5.3 避免在索引列上使用NOT 17 2.5.4 用>=替代> 18 2.5.5 避免在索引列上使用IS NULL和IS NOT NULL 18 2.5.6 带通配符(%)的like语句 18 2.5.7 总是使用索引的第一个列 19 2.5.8 多个平等的索引 19 2.5.9 不明确的索引等级 19 2.5.10 自动选择索引 19 2.5.11 使用提示(Hints) 19 2.5.12 表上存在过旧的分析 20 2.5.13 表上存在并行 21 2.5.14 关于索引建立 21 3. PLSQL程序性能问题测试方法 21 3.1 性能问题分析 21 3.2 EXPAIN PLAN分析索引使用 22 3.3 TOPSQL分析 24 3.4 针对性语句搜索 28 3.5 后台存储过程跟踪 29 3.6 性能监控 30 4. 性能测试工具设计思想 31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值