Oracle性能一二事

Oracle性能可以进行多方面优化,下面记录使用Oracle过程中对其进行的一些优化笔记;

  1. 随着数据量的增加,Orace在open->fetch->cursor中会越来越慢,尤其数据量达到百万级别的时候,可能open cursor就要半个小时甚至更久,甚至更坑爹的是,你需要筛选出来的数据却很少或者根本没有。汗!!! 那么这时候索引就起作用了,对你的筛选条件进行审慎的索引,那么会大大提升open->fetch->cursor的速度,未建索引之前,你可能需要多半个小时甚至一小时,建了索引之后你可能只需要几秒或者几分钟,这就是效果。
    示例1: orcale建立索引:
    create unque index idx_tbl_xxxx_xxx_1 on tbl_xxxx_xxx (ee, bbb, ccc) ; –唯一索引
    create index idx_tbl_xxxx_xxx_2 on tbl_xxxx_xxx (aaa, bbb, ccc) ; –普通索引

  2. 如果创建了索引,还未起效果或者效果时号时坏(有时很快,有时很慢), 在数据量差不多的情况下,这就有可能是对比的table, 索引比较多,有相似索引,Oracle走了其他多索引,那么这时可以使用“指定索引”,强制给我们要执行的对应的SQL”指定索引”,则会启一定效果。
    示例1: oracle指定索引:
    select /+ index(idx_tbl_xxxx_xxx_1) / * from tbl_xxxx_xxx where ee=’xx’ and bb=’xxx’;

  3. 我们再”指定索引”了之后,如果对应的性能没有大幅提升,或提升微弱,那么可以换做“全表扫描”,对应整个表进行“全表扫描”的效果有时会好过指定索引,可能比较两个执行效率,做最优选择。
    示例1: oracle全表扫描:
    select /+ parallel(t, 6) full(t) / * from tbl_xxxx_xxx t where ee=’xx’ and bb=’xxx’;
    NOTE: 我在进行统计某个表某一列(比如,笔数,金额)时,使用“指定索引”反而没有在“未指定索引”的情况下执行效率高,800万数据量,所需统计数据占比50%,未指定索引,有时:120秒,指定索引:超过20分钟,甚至更长,汗!!! 但在未指定索引情况下,偶尔也会出现执行超长的情况,可能Oracle走了错误的其他非最优索引,或者统计分析不到位??? 后来,我改成“全表扫描”, 执行效率大幅提升,原先所需120秒的,现在30秒内搞定。

其他:
1. 在生产环境,我们要临时创建索引,提高执行效率,如果某个表数据量很大,有几百万,那么创建相关索引时可能会比较慢,这时我们可以使用oracle多进程并行创建索引:
示例1: oracle多进程并行创建索引:

drop index idx_tbl_xxxx_xx_2;
create index idx_tbl_xxxx_xxx_2 on tbl_xxxx_xxx (aaa, bbb, ccc) ;
alter idx_tbl_xxxx_xx_2 noparallel;
NOTE: 重建索引,需要(加并行执行后,一定需要在索引创建完成后把并行度改回noparallel,否则索引可能用不上):

NOTE: 收集统计信息:
exec dbms_stats.gather_table_stats(ownname = 'xxx',tabname => 'tbl_xx',cascade => true, degree => 8,no_invalidate => false);
  1. Oracle查询表索引
    select * from user_indexes where table_name = ‘表名’;
    select * from user_ind_columns where index_name = ‘索引名’;

你可能感兴趣的:(SQL)