几个建议:
sort_area_size有200多M,如果order by/group by的数据量不大的话,缩小它,留出的mem给db_block_buffers如果你这台机器只作为database服务器,不做其它用途,在初始化文件中加入:
lock_sga=true再有,把你的online log的情况和rollback segment的情况贴出来:select * from v$log;select initial_extent,next_extent from dba_rollback_segslogfile的size不能太小
rollback segment 数量不能太少,extent也不能太小

解决方案 »

  1.   


    SQL> select * from v$log;   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
    --------- --------- --------- --------- --------- --- ---------------- ------------- ---------
            1         1     88021   1048576         1 NO  INACTIVE              18923645 01-APR-04
            2         1     88022   1048576         1 NO  INACTIVE              18923658 01-APR-04
            3         1     88023   1048576         1 NO  INACTIVE              18923671 01-APR-04
            4         1     88020   1048576         1 NO  INACTIVE              18923628 01-APR-04
            5         1     88024   1048576         1 NO  CURRENT               18923683 01-APR-04
    SQL> select initial_extent,next_eINITIAL_EXTENT NEXT_EXTENT
    -------------- -----------
             51200       51200
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           2097152     2097152
           2097152     2097152
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     5242880
           5242880     524288021 rows selected.
      

  2.   

    清除數據碎片:我们知道,Oracle作为一种大型数据库,广泛应用于金融、邮电、电力、民航等数据吞吐量巨大,计算机网络广泛普及的重要部门。对于系统管理员来讲,如何保证网络稳定运行,如何提高数据库性能,使其更加安全高效,就显得尤为重要。作为影响数据库性能的一大因素--数据库碎片,应当引起DBA的足够重视,及时发现并整理碎片乃是DBA一项基本维护内容。 
    ---- 1、碎片是如何产生的 
    ---- 当生成一个数据库时,它会分成称为表空间(Tablespace)的多个逻辑段(Segment),如系统(System)表空间,临时(Temporary)表空间等。一个表空间可以包含多个数据范围(Extent)和一个或多个自由范围块,即自由空间(Free Space)。 
    ---- 表空间、段、范围、自由空间的逻辑关系如下: ---- 当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的,如图〈1〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择), 而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。例如: ---- 2、碎片对系统的影响 
    ---- 随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响: 
    ---- (1)导致系统性能减弱 
    ---- 如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而"最大"自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态; 
    ---- (2)浪费大量的表空间 
    ---- 尽管有一部分自由范围(如表空间的pctincrease为非0)将会被SMON(系统监控)后台进程周期性地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。 
    ---- 3、自由范围的碎片计算 
    ---- 由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用FSFI--Free Space Fragmentation Index(自由空间碎片索引)值来直观体现: 
    FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))
    ---- 可以看出,FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降。 
    ---- 下面的脚本可以用来计算FSFI值: 
    rem FSFI Value Compute
    rem fsfi.sql
    column FSFI format 999,99
    select tablespace_name,sqrt(max(blocks)/sum(blocks))*
    (100/sqrt(sqrt(count(blocks)))) FSFI
    from dba_free_space
    group by tablespace_name order by 1;
    spool fsfi.rep;
    /
    spool off;
    ---- 比如,在某数据库运行脚本fsfi.sql,得到以下FSFI值: 
    TABLESPACE_NAME FSFI
    ------------------------------ -------
    RBS 74.06
    SYSTEM 100.00
    TEMP 22.82
    TOOLS 75.79
    USERS 100.00
    USER_TOOLS 100.00
    YDCX_DATA 47.34
    YDCX_IDX 57.19
    YDJF_DATA 33.80
    YDJF_IDX 75.55
    ---- 统计出了数据库的FSFI值,就可以把它作为一个可比参数。在一个有着足够有效自由空间,且FSFI值超过30的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。 
    ---- 4、自由范围的碎片整理 
    ---- (1)表空间的pctincrease值为非0 
    ---- 可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如: 
    alter tablespace temp
    default storage(pctincrease 1);
    ---- 这样SMON便会将自由范围自动合并。也可以手工合并自由范围: 
    alter tablespace temp coalesce;
    ---- 5、段的碎片整理 
    ---- 我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents。如果段的碎片过多, 将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用Import/Export(输入/输出)工具来完成。 
    ---- Export()命令有一个(压缩)标志,这个标志在读表时会引发Export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间。若这个表关闭, 则使用Import()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如: 
    exp user/password file=exp.dmp compress=Y grants=Y indexes=Y
    tables=(table1,table2);
    ---- 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表: 
    imp user/password file=exp.dmp commit=Y buffer=64000 full=Y
    ---- 这种方法可用于整个数据库。 
    ---- 以上简单分析了Oracle数据库碎片的产生、计算方法及整理,仅供参考。数据库的性能优化是一项技术含量高,同时又需要有足够耐心、认真细致的工作。 对数据库碎片的一点探讨, 
    ---- 如果能起到抛砖引玉,对大家有所启发的话,便是作者最大的心愿。
      

  3.   

    除了drabit(square)讲到的,我的初始化还有其他问题吗?我准备先试一下这个方法,不过数据库现在不能停,要到晚上6点-6点半之间
      

  4.   

    to aska_xxy:你的log文件只有1M,会频繁的切换,不慢都不行啊,至少10M以上。rollback segment的extent只有5m,稍微大一点的事务就会频繁的extend/shrink,也是造成慢的原因表空间碎片对性能造成的影响不会很大,如果你数据库是8i,可以使用local-managed tablespace,不产生碎片.
      

  5.   

    谢谢drabit(square) !!我按照你的说法修改一下初始化文件,晚上重起oracle,大概明天上班看一下使用情况,希望情况有所好转。
      

  6.   

    请问你说的 “log文件只有1M“指的是哪一段呢?
      

  7.   

    SQL> select * from v$log;   GROUP#   THREAD# SEQUENCE#     BYTES   MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
    --------- --------- --------- --------- --------- --- ---------------- ------------- ---------
            1         1     88021   1048576         1 NO  INACTIVE              
    '1048576'字节就是1M.如果log文件不改大,数据库还是会慢的.
      

  8.   

    如何修改这个大小呢?直接 Alter DataBase DataFile吗?我发现有8个log文件 log1orcl.ora-------log8orcl.ora
      

  9.   

    alter database datafile '数据文件路径' resize 50m
      

  10.   

    先创建几个大的logfile,例如:SQL> alter database add logfile 'd:\oracle\ora92\ora902\redo04.log' size 15M;数据库已更改。然后drop小的logfile,例如
    SQL> alter database drop logfile 'd:\oracle\ora92\ora902\redo03.log';数据库已更改。如果你要drop的是当前的log,oracle会报错:
    SQL> alter database drop logfile 'd:\oracle\ora92\ora902\redo02.log';
    alter database drop logfile 'd:\oracle\ora92\ora902\redo02.log'
    *
    ERROR 位于第 1 行:
    ORA-01623: 日志2是线程1的当前日志 - 无法删除
    ORA-00312: 联机日志 2 线程 1: 'D:\ORACLE\ORA92\ORA902\REDO02.LOG'没关系,切换一下日志就可以drop它:
    SQL> alter system checkpoint;系统已更改。SQL> alter system switch logfile;系统已更改。SQL> alter database drop logfile 'd:\oracle\ora92\ora902\redo02.log';数据库已更改。
      

  11.   

    to welyngj:redo log是不能用resize操作的!只能用rename.
      

  12.   

    thank you very much!!刚才改完初始化文件服务器起不来了,回家了,明天我继续研究,再次谢谢!