plsql 性能分析

xiaoxiao2024-10-28  14

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); 这次查出来就快乐。。

转载请注明原文地址: https://www.6miu.com/read-5018685.html

最新回复(0)