pl/sql 性能分析

SET TIMING ON SERVEROUTPUT ON
DECLARE
   v_count NUMBER(10);
BEGIN
   SELECT COUNT(rowid)
   INTO v_count
   FROM person
   WHERE gender = 'F'
   AND activity_id = '11'
   AND hair_color = 'BLONDE'
   AND age = 34
   AND eye_color = 'BROWN';
   DBMS_OUTPUT.PUT_LINE(v_count);
END;

person 有4万8千条...

这条SQL 耗费了 将近10秒 因为做了全表扫描 因为条件中没有任何加索引的列。。

那么如何分析呢

ALTER SESSION SET SQL_TRACE = TRUE;
运行之前把SQL_TRACE 打开

运行之后把SQL_TRACE 关掉

select value from v$parameter where name='user_dump_dest';

或者  alter system set user_dump_dest='c:\temp';

可得到跟踪文件的位置。。

E:\ORACLE\PRODUCT\10.1.0\ADMIN\ORCL\UDUMP


然后进入命令行看下这个目录

2008-04-23  16:48             6,770 orcl_ora_1136.trc
2008-04-22  17:56             2,217 orcl_ora_1472.trc
2008-04-23  08:58             2,941 orcl_ora_1716.trc
2008-04-23  16:10             7,608 orcl_ora_2364.trc
2008-04-24  09:02             2,941 orcl_ora_2464.trc
2008-04-23  08:58             2,590 orcl_ora_2512.trc
2008-04-22  17:56             3,836 orcl_ora_2540.trc
2008-04-22  17:59             1,237 orcl_ora_3096.trc
2008-04-24  09:03             2,525 orcl_ora_3148.trc
2008-04-24  10:18           179,058 orcl_ora_3648.trc
2008-04-22  17:58            47,879 orcl_ora_3668.trc
2008-04-22  17:55             2,912 orcl_ora_4312.trc
2008-04-22  17:59             2,912 orcl_ora_4648.trc
2008-04-22  17:59               880 orcl_ora_4840.trc
2008-04-22  17:57               942 orcl_ora_5020.trc
2008-04-22  18:27           141,451 orcl_ora_6004.trc

找到刚才生成的文件。。orcl_ora_1136.trc


然后在命令行运用命令 tkprof

我这里用。。

E:\oracle\product\10.1.0\admin\orcl\udump>tkprof orcl_ora_1136.trc c:/sql_trace.
txt explain=plsql/oracle sort=exeela,prsela,fchela


语法可以参加命令帮助。。

得到文件sql_trace.txt 可以看下这个文件。。

SELECT COUNT(ROWID)
FROM
PERSON WHERE GENDER = 'F' AND ACTIVITY_ID = '11' AND HAIR_COLOR = 'BLONDE'
  AND AGE = 34 AND EYE_COLOR = 'BROWN'


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      1.98      10.36      71288      72202          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      2.00      10.37      71288      72203          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 65     (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=72202 pr=71288 pw=0 time=10360093 us)
  36371   TABLE ACCESS FULL PERSON (cr=72202 pr=71288 pw=0 time=8037861 us)

********************************************************************************

CPU占用了不到2秒 执行时间10秒以上。。

结论是这种语句造成了多种进程查询。。

解决办法 如果条件的基数不大 加索引 或者加位图索引。。

DROP INDEX gender_idx;
CREATE BITMAP INDEX person_idx
ON person(gender,
          activity_id,
          hair_color,
          age,
          eye_color);

这次查出来就快乐。。

  • 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
PL/SQL中,有几种方法可以提高批量操作的性能: 1. 使用FORALL语句进行批量操作:FORALL语句可以用于在单个SQL语句中执行多个绑定变量的批量操作。相比于逐条执行SQL语句,使用FORALL可以减少与数据库的交互次数,从而提高性能。 2. 使用BULK COLLECT语句进行数据集合的批量读取:BULK COLLECT语句可以将查询结果一次性读取到集合中,而不是逐条读取。这样可以减少与数据库的交互次数,提高读取性能。 3. 使用合适的索引:合适的索引可以加速特定条件下的数据库查询。通过分析查询语句和数据访问模式,选择合适的索引可以优化查询性能。 4. 使用合适的数据类型和数据结构:选择合适的数据类型和数据结构可以减少存储空间和I/O操作,从而提高性能。例如,使用紧凑型数据类型(如BINARY_INTEGER)代替大型数据类型(如NUMBER),使用PL/SQL记录类型代替独立的变量等。 5. 使用合适的缓存:缓存可以降低对数据库的访问次数,提高性能。例如,可以使用PL/SQL表或集合来缓存中间结果,避免频繁查询数据库。 6. 优化SQL语句:优化SQL语句可以提高数据库查询的性能。使用合适的查询条件、索引和JOIN语句,避免不必要的数据排序和过滤,可以减少查询时间。 7. 使用合适的事务管理:合理管理事务可以提高批量操作的性能。例如,可以使用适当的事务隔离级别、合理控制事务的范围和持有时间,避免不必要的锁和冲突。 8. 适当处理异常:合理处理异常可以避免不必要的回滚和重复操作,提高性能。使用EXCEPTION子句捕获和处理特定异常,采取合适的补救措施。 这些方法可以根据具体情况选择和组合使用,以提高PL/SQL批量操作的性能。同时,根据实际需求进行性能测试和优化,可以进一步提升性能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值