体系结构方面的优化问题:
- 设数据库很大,访问量非常高,共享池很小:这样共享池里面就无法存储很多解析过得sql语句,导致很多硬解析,这样数据库就非常缓慢。这个时候要加大共享池。如果是自动管理,就加大SGA的大小。
- 设:某平时不经常访问的数据库的主机才4G内存,去开辟了3G的SGA,500m的PGA,由于OS操作系统内存不足,导致主机运行缓慢,我们要减少SGA大小。
- 如果由于数据缓存区过小而产生的大量物理读,则要增大SGA。
- 如果排序使用了临时表空间,就说明PGA过小,如果系统有额外的大量内存,可以考虑多分配一部分给PGA(一般是OLAP系统)
- 如果数据库有大量的更新操作,产生大量的日志导致日志切换频繁,在日志切换过程中,数据库会停滞运行,为了提高性能,需要加大日志文件的大小。
- 如果某个应用因为老是查出ORA-01555错误而无法把值给下一个模块使用,导致生产出现故障。需要检查为什么这个sql执行这么慢。优化的方法:加索引,清理历史数据,让表的记录小一点,或者增大undo_retention的值(这个值只是建议值,非强制),也可以增大undo表空间。
具体的sql优化:
- 构造环境 + 未优化(单车速度:40+秒
sqlplus drop table t purge; create table t (x int); alter system flush shared_pool; set timing on
create or replace procedure proc1 as begin for i in 1..100000 loop execute immediate ‘insert into t values(‘||i||’)’; commit; end loop; end; /
exec proc1;
col sql_text format a30
set pagesize 1000
select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like ‘%insert into t values%‘ and rownum<100;
- 绑定变量,摩托速度:8+秒
create or replace procedure proc2 as begin for i in 1..100000 loop execute immediate ‘insert into t values( :x )‘ using i; commit; end loop; end; /
select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like ‘%insert into t values%‘;
- 静态改写,汽车速度:6+秒
create or replace procedure proc3 as begin for i in 1..100000 loop insert into t values( i ); commit; end loop; end; /
- 批量提交,动车速度:2秒
create or replace procedure proc4 as begin for i in 1..100000 loop insert into t values( i ); end loop; commit; end; /
- 集合写法,飞机速度:.14秒
insert into t select rownum from dual connect by level <=100000;
- 直接路径,火箭速度:.89秒,在10万的时候是.23所以需要量才能看得出来快了。
create table t as select rownum x from dual connect by level <= 1000000;
- 并行设置,飞船速度:需要有多cpu:本机实测1.05秒比6性能差,一般在机器空闲而且性能强大时用。
create table t nologging parallel 4 as select rownum x from dual connect by level <=1000000;
##resetpool.sql:drop table t purge; create table t(x int); alter system flush shared_pool; set pagesize 1000 col sql_text format a30
时间: 2024-10-07 11:34:50