我们的DB中有一张表非常大,记录数在2800W左右,我按年份备份了一下,删除了1400万条数据,只保留了2年的数据。
但表空间使用率并未下降。运行以下命令:alter tablespace endat01 coalesce;
很快就完了,但表空间使用率未变化。我记得可以用命令释放删除数据后的表空间,但报错如下:
1,修改表,启动行移动的功能
alter table 表名 enable row movement;
(提示:ORA-14066: 非法的非分区表选项)
2,修改表,收缩表空间
alter table 表名 shrink space;
(提示:ORA-01735: 非法的 ALTER TABLE 选项)
怀疑是因为oracle版本太低,不支持!请各位帮忙看看有什么办法。
此外,我们的数据库最近变得很慢,不知道是什么原因。
初步查了一下服务器CPU,内存占用率都比较低,应该不是服务器硬件的原因,应该是oracle的原因。
但实在不知道怎么查,不知道怎么优化?各位大侠能否给个思路!附:---------------------------------------------
介绍一下我们的数据库配置:
服务器:3.16G双核,4G内存,584G硬盘(Rid5,有硬Rid卡)
数据库:oracle8.16
日常会话:230个左右
数据文件:195
数据文件大小:50G左右
表空间:34(索引和数据分开建的表空间,但在同一个驱动器上)
最大占用率:79%(不算回滚表空间,回滚表空间只有3个,各256M,有一个占用率为83%)
shared_pool_size=50M
db_writer_processes=1
---------------------------------------------

解决方案 »

  1.   

    先把表数据备份到另外一张表中,然后执行truncate table table_name
    然后再把备份的导入到这个表中,然后删除备份表,试试
    alter table 表名 shrink space; 
    好像是在10g上才支持的
      

  2.   

    oracle8.16 不支持非分区表的row movement,所以连带的不能够使用shrink space方法1: exp导出再导入
    方法2: move tablespace,需要重建索引
    alter table tab_name move tablespace xxx;
      

  3.   

    学习中,不过我觉得删除这么多的数据,所以即使不重建,也需要分析了,
    然后,删除这么多用DELETE会用很长时间吧,
    综合看来,还不如导出需要的数据到备份表,TRUNCATE,然后导入,重建索引来的划算呢,呵呵,学习哦
      

  4.   

    是什么版本的Oracle,如果是8i,用bstat和estat来进行分析,如果是9i用stackpack来分析,可以生成报告来判断数据库的资源使用及占用资源最大的sql及等待事件情况.
      

  5.   


    bstat,estat是什么啊
    8i不能用Stackpack分析么,我刚找了关于这个的资料。
      

  6.   


    还要问一下啊,回滚表空间要不要增加呢。现在的DB中,只有3个回滚表空间,每个只有256M,使用率分别为79.8,28.7,83.3这个是不是也是影响速度的原因之一呢?+++
    再汇报一下:
    前天晚上重建了全部索引(增加临时表空间TMP01~04G,H.ora8个文件)。
    效果很奇怪:相关部门反应,速度快了,使用时可以连着点了
    但我们用以下语句查询表空间占用情况时,速度奇慢,比平时还要慢很多,每次都要1200多秒,即使在服务品端也要977秒!实在奇怪。+++
    准备重做系统,升级数据库:
    初步想用win2003server + oracle10g大家有什么好的建议啊!
      

  7.   

    补充一下:
    重建索引语句:ALTER INDEX PK_ENJBTR03 REBUILD NOLOGGING TABLESPACE BKENIDX01;查询表空间占用情况SQL:SELECT
        A.TABLESPACE_NAME as TABLESPACE,
        ROUND(SUM(A.TOTAL1)/1024/1024, 1) as  "Allocate(MB)",
        ROUND((SUM(A.TOTAL1)-SUM(A.SUM1))/1024/1024,1) as  "Used(MB)",
        ROUND(SUM(A.SUM1)/1024/1024,1) as "Free(MB)",
        100-ROUND((SUM(A.SUM1)/SUM(A.TOTAL1)*100),1) as "(%)",
        ROUND(SUM(A.MAXB)/1024/1024,1) as "Max Size",
        MAX(A.CNT) as "Fragment"
     FROM (
          SELECT
              TABLESPACE_NAME,
              0 as TOTAL1,
              SUM(BYTES) as SUM1,
              MAX(BYTES) as MAXB,
              COUNT(BYTES) as CNT
            FROM DBA_FREE_SPACE
            GROUP BY TABLESPACE_NAME
          UNION
          SELECT
             TABLESPACE_NAME,
             SUM(BYTES) as TOTAL1,
             0,
             0,
             0
             FROM DBA_DATA_FILES
             GROUP BY TABLESPACE_NAME
       ) A
     GROUP BY A.TABLESPACE_NAME   这里不能边续回复啊,,晕,不知道能不能发出去。
      

  8.   


    下面取自Oracle9i文档
    Statspack is not supported with releases earlier than 8.1.6.所以可以知道从8.1.7开始支持Statspack.
      

  9.   

    我也遇到过楼主类似的问题。
    当时是采用3楼的方法解决的。
    我觉得楼主的数据库设计应该更改一下:
    假设那个大表叫TA,目前用户为UA,你应该在其他用户UB中建立一个同TA一样的表,存储在不同的表空间中.
    并在每天夜维或每隔一段时间,自动把UA.TA部分内容导入到UB.TA中,这样,UA.TA永远不会太大。
      

  10.   

    需要注意的是:即使表空间回缩,数据文件德武里村也不会降低。
    可以通过resize的方法回收物理空间。