1 不修改表结构的优化

1.1 收缩表,降低高水位线

ALTER TABLE TEST ENABLE ROW MOVEMENT;
ALTER TABLE TEST SHRINK SPACE;

1.2 对表收集统计信息

BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => user,
tabname => 'TEST');
END;

1.3 使用oracle的并行查询功能

SELECT /*+ parallel(4)*/* FROM test;

1.4 OR查询条件使用union all替代

1.5 多表联合查询时,在子查询中先写好过滤条件再关联别的表

1.6 DML比较慢时而且并发访问比较低的情况下,会话开启并行DML功能。

Alter session enable parallel dml;

1.7 在insert时使用直接加载和nologging方式插入数据

Insert /*+ append parallel(4)*/ into test nologging select * from YYY;

1.8 update卡死时,可以使用先删除后插入的做法代替

1.9 delete卡死时,可以将保留的数据复制到临时表中,然后truncate目标表,最后将临时表数据插入目标表。

create table tmp_test nologging as select /*+ paralle(4)*/ * from test where ...;--筛选保留的数据
truncate table test ;
insert /*+ append parallel(4)*/ into test nologging select * from tmp_test  ;

2 修改表结构的优化

2.1 在筛选(where)少部分数据的字段上建立索引

2.2 如果查询(select)或者排序(order by)涉及的字段很少,可以在这些字段建立索引

2.3 如果建立了索引,索引没有生效,查询索引状态是否正常。索引为'UNUSABLE'状态要重建索引

2.4 往目标表插入数据时,可以将索引置为'UNUSABLE'状态,等插入数据后,再重建索引

alter index IDX_TEST unusable;

2.5 对表根据业务需求进行分区

2.6 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间

2.7 涉及LOB字段类型的表,将LOB字段放在一个单独的表空间。因为oracle默认不会缓存大于4000字节的LOB字段,直接从磁盘读写LOB。放在单独的表空间,从而减少对其他大部分对象的影响

2.8 查询表的行迁移情况,如果表行迁移的数据过多,就需要重新建表,同时合适设置PCTFREE,避免更新再次导致行迁移

--查询行迁移情况
ANALYZE TABLE TEST COMPUTE STATISTICS;
SELECT chain_cnt,
      round(chain_cnt/num_rows*100,2) pct_chained,
      avg_row_len, pct_free , pct_used
 FROM user_tables
WHERE table_name = 'TEST';

3 在存储过程的优化

3.1 执行动态sql时使用绑定变量的方式输入变量值

3.2 将大表按使用到的字段拆分成中间表。后面使用中间表数据而不是大表数据参与计算。将大表数据插入到中间表时,使用直接加载和nologging方式插入数据。拆分中间表后,要对中间表收集统计信息。

3.3 存储过程用到临时表(TEMPORARY TABLE)时,将临时表产生的undo数据设置为放在临时表空间

--临时表产生的undo数据设置为放在临时表空间
ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;
posted on 2024-07-24 13:18  追求完美9196  阅读(86)  评论(0编辑  收藏  举报