Oracle体系结构知识点的运用

体系结构方面的优化问题:

  1. 设数据库很大,访问量非常高,共享池很小:这样共享池里面就无法存储很多解析过得sql语句,导致很多硬解析,这样数据库就非常缓慢。这个时候要加大共享池。如果是自动管理,就加大SGA的大小。
  2. 设:某平时不经常访问的数据库的主机才4G内存,去开辟了3G的SGA,500m的PGA,由于OS操作系统内存不足,导致主机运行缓慢,我们要减少SGA大小。
  3. 如果由于数据缓存区过小而产生的大量物理读,则要增大SGA。
  4. 如果排序使用了临时表空间,就说明PGA过小,如果系统有额外的大量内存,可以考虑多分配一部分给PGA(一般是OLAP系统)
  5. 如果数据库有大量的更新操作,产生大量的日志导致日志切换频繁,在日志切换过程中,数据库会停滞运行,为了提高性能,需要加大日志文件的大小。
  6. 如果某个应用因为老是查出ORA-01555错误而无法把值给下一个模块使用,导致生产出现故障。需要检查为什么这个sql执行这么慢。优化的方法:加索引,清理历史数据,让表的记录小一点,或者增大undo_retention的值(这个值只是建议值,非强制),也可以增大undo表空间。

具体的sql优化:

  1. 构造环境 + 未优化(单车速度: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;
  2. ##resetpool.sql:
    drop table t purge; create table t(x
    int); alter system flush shared_pool; set pagesize 1000 col sql_text format a30
  3. 绑定变量,摩托速度: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%';
  4. 静态改写,汽车速度:6+秒
    create or replace procedure proc3
    
    as
    
    begin
    
            for i in 1..100000
    
            loop
    
                    insert into t values( i );
    
                    commit;
    
            end loop;
    
    end;
    
    /
  5. 批量提交,动车速度:2秒
    create or replace procedure proc4
    
    as
    
    begin
    
            for i in 1..100000
    
            loop
    
                    insert into t values( i );
    
            end loop;
    
    commit;
    
    end;
    
    /
  6. 集合写法,飞机速度:.14秒
    insert into t select rownum from dual connect by level <=100000;
  7. 直接路径,火箭速度:.89秒,在10万的时候是.23所以需要量才能看得出来快了。
    create table t as select rownum x from dual connect by level <= 1000000;
  8. 并行设置,飞船速度:需要有多cpu:本机实测1.05秒比6性能差,一般在机器空闲而且性能强大时用。
    create table t nologging parallel 4 as select rownum x from dual connect by level <=1000000;

你可能感兴趣的:(oracle)