yr512656630 发表于 2013-2-1 11:51:59

oracle 优化分析

记录下来,做数据库优化和索引分析的方案

案例:
1:在分区表中,全局索引可能会导致索引失效,这样执行计划中不走索引,改本地索引local


2:对表进行分析,不用analyze,用了会对执行计划产生影响,对表和索引分析建议用dbms
exec dbms_stats.gather_table_stats(user,upper('tb_ori_0076'),cascade => true,degree => 2);exec dbms_stats.gather_table_stats(user,                                 upper('tb_public_0005'),                                 cascade => true,                                 degree => 2);exec dbms_stats.gather_table_stats(user,                                 upper('tb_index_0056'),                                 cascade => true,                                 degree => 2);exec dbms_stats.gather_table_stats(user,                                 upper('tb_index_0055'),                                 cascade => true,                                 degree => 2);exec dbms_stats.gather_index_stats(user,'IDX83882807',degree=>2);


3:学会查看explain plan for 执行计划,并创建合适的索引,必要的时候需要用到hint

使用方法:sqlplus user/username@sid
explain plan for sql语句set timing onset pagesize 1000set linesize 150spool c:/abc.lst@?/rdbms/admin/utlxplpspool off

4:使用跟踪事件10046,10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强
SQL>select * from dual;SQL>alter session set events '10046 trace name context forever,level 12';SQL>粘贴要跟踪的sql并执行完成SQL>alter session set events '10046 trace name context off';SQL>exitC:\>e:E:\oracle\product\10.1.0\admin\TESTDB\udump>tkprof testdb_ora_1484.trc abc sys=no可以在该目录中找到abc这个跟踪文件,进行分析

5:附件是2个写好的plsql命令,abc.sql是利用oracle后台job进行分区在某个时间自动新增分区,tabinfo.sql是分析数据库中当前表,并检索出表中各个字段情况。
通过此分析能快速帮我们排除哪些字段上建立索引最合适。

SQL>@c:\abc.sql 需要开启oracle后台作业进程oracleJobSchedulerSQL> select JOB_NAME,NEXT_RUN_DATE from dba_scheduler_jobs where job_name='MONTHLY_ADD_PARTITION';查看job任务
任务删除 drop_scheduler drop_job

   SQL>@c:\tabinfo.sql 输入用户名和表名即可


SELECT no_, stock_code, stock_name, price_, money_flow_5, businessFROM (SELECT /*+ ordered index(t4TB_ORA_0004_IDX1) index(t4_b TB_ORA_0004_IDX1) */ ROW_NUMBER () OVER (ORDER BY (t4.f0004_028n- t4_b.f0004_028n) DESC) no_,               t4.f0004_005v stock_code, t5.f0005_002v stock_name,               t4.f0004_007n price_,               t4.f0004_028n - t4_b.f0004_028n money_flow_5,               t55.f0055_002v AS business          FROM tb_ori_0004 t4               INNER JOIN               (SELECT /*+ index(tb_ori_0004 TB_ORA_0004_IDX1) */f0004_005v, f0004_003v, f0004_004v,                         MAX (f0004_002v) f0004_002v                  FROM tb_ori_0004                   WHERE f0004_001d = (SELECT MAX (f0076_001d)                                       FROM tb_ori_0076)                GROUP BY f0004_005v, f0004_003v, f0004_004v) t               ON t4.f0004_003v = t.f0004_003v             AND t4.f0004_004v = t.f0004_004v             AND t4.f0004_005v = t.f0004_005v             AND t4.f0004_002v = t.f0004_002v             AND t4.f0004_001d = (SELECT MAX (f0076_001d)                                    FROM tb_ori_0076)               INNER JOIN tb_ori_0004 t4_b               ON t4_b.f0004_003v = t.f0004_003v             AND t4_b.f0004_004v = t.f0004_004v             AND t4_b.f0004_005v = t.f0004_005v             AND t4_b.f0004_002v =TO_CHAR (TO_DATE (t.f0004_002v, 'HH24MI') - 4 / (24 * 60),                           'HH24MI'                            )             AND t4.f0004_001d = t4_b.f0004_001d               INNER JOIN tb_public_0005 t5               ON t4.f0004_003v = t5.f0005_007v             AND t4.f0004_004v = t5.f0005_005v             AND t4.f0004_005v = t5.f0005_001v               INNER JOIN               (SELECT t.f0056_003v, t.f0056_002n                  FROMtb_index_0056 t                  WHEREt.f0056_001d = (SELECT MAX (t.f0056_001d)                                          FROM tb_index_0056 t)) t6                ON t6.f0056_003v = t5.f0005_001v                  INNERJOIN               (SELECTt.f0055_001n, t.f0055_002v                  FROMtb_index_0055 t               WHERE t.f0055_003v = '新申万一级') t55               ON t55.f0055_001n = t6.f0056_002n               )WHERE no_ <=30;
页: [1]
查看完整版本: oracle 优化分析