我建了一个数据库,在建立的时候都是用的默认设置,但是现在发觉在删除文件时只能删除大约5000条数据,当删除的数据数量大于5000时等再长的时间都没有反应,而且删除了5000条数据,就要COMMIT一次,否则也是无法删除数据,我想可能是缓冲区太小的缘故,但是我不知道怎样去解决,请高手指教!!谢谢!!

解决方案 »

  1.   

    修改init.ora文件里面的那个选项,那里面的很多东本我都不是很清楚。可以解释一下吗?
    还有,怎样用命令来修改呢??
      

  2.   


     不是缓冲区太小,而是回滚段太小,因为delete操作要保存删除前的
     映像文件. 关于init.ora文件的参数配置,你可以去itpub.net看看,我记得biti
      专门写了一篇文章. 8i主要考虑下面几个核心参数:     Db_block_buffers
         Shared_pool_size
         Large_pool_size
         Java_pool_size
         log_buffer
         processes
         sort_area_size
         ...  用命令修改,主要有两个命令: alter system 和alter session.
      去看看这方面的资料吧.
      

  3.   

    同意楼上的意见:
    db_block_size:数据块大小,参数是在创建数据库是设置的,他决定了数据库里每个块的大小
    db_block_buffers:数据块缓冲大小,设置数据块在系统全局区里的高速缓存的大小
    shared_pool_size:共享池大小,设置系统全局区里的共享池的大小
    log_buffer:设置系统全局区里的重写日志缓冲器的大小
    rollback_segments:数据库回滚段的大小,这个参数设置不当往往会引起事务处理的I/O瓶颈
      

  4.   

    我在服务器上找到了initorc1.ora文件,里面文件显示为:
    db_name = orc1
    db_files = 1020
    control_files = ("d:\orant\database\ctl1orc1.ora", "d:\orant\database\ctl2orc1.ora")
    db_file_multiblock_read_count = 32
    db_block_buffers = 3200
    shared_pool_size = 12000000
    log_checkpoint_interval = 8000
    processes = 200
    dml_locks = 500
    log_buffer = 163840
    sequence_cache_entries = 100
    sequence_cache_hash_buckets = 89
    #audit_trail = true
    #timed_statistics = true
    background_dump_dest = d:\orant\rdbms80\trace
    user_dump_dest = d:\orant\rdbms80\trace
    db_block_size =2048
    compatible = 8.0.5.0.0
    sort_area_size = 65536
    log_checkpoint_timeout = 0
    remote_login_passwordfile = shared
    max_dump_file_size = 10240
    text_enable = true
    然后我创建了回滚段:
    CREATE PUBLIC ROLLBACK SEGMENT rb_sh
    TABLESPACE sh
    STORAGE (INITIAL 5M NEXT 5M MINEXTENTS 2
    MAXEXTENTS 50 OPTIMAL 11M)
    使回滚段在线:
    ALTER ROLLBACK SEGMENT rb_shxt ONLINE; 
    然后在initorc1.ora文件尾加上 ROLLBACK_SEGMENT=(rb_sh)  语句后重启服务,
    发现重启服务后连接数据库提示oracle不可用!!
    请问各位高手一个,怎样设置回滚段呀。我这样设置为何不行???
      

  5.   

    先说说初始化参数文件的问题:  很多参数配置我觉得不是太合理control_files =  
    最好设置成三个,这样,如果一个你的控制文件如果损坏了,还可以使用另外两个db_file_multiblock_read_count = 32 
    有点偏大,会造成使用全表扫描,而不是使用索引db_block_buffers = 3200  
    比较小,相关的计算公式: db_block_buffers * db_block_size 
    应该占SGA总量的50%-60%shared_pool_size = 12000000 
    目前还不太好说,需要做个statspack report 进行验证max_dump_file_size = 10240 
    有点大,每个dump文件为5M, 查看起来也不太方便,
    设置成1024足够了(500k)background_dump_dest,user_dump_dest:这两个参数最好设置不同的路径,这样检查起来方便一点sort_area_size = 65536 
    可能有点小,系统中有没有使用order by, group by, distinct 之类的
    大查询语句? 如果有的话,设置大一些. 再说说回滚段的问题:
      initorcl.ora中存放的是私有回滚段的信息,一般来说OLTP应用建议
      每四个transaction使用一个rbs段,例如有40个并发事务,私有回滚段
     就可以设置成10个.  把创建语句中的public 关键字去掉.
      

  6.   

    db_file_multiblock_read_count = 32 
    有点偏大,会造成使用全表扫描,而不是使用索引那位大虾解释一下?在ORACLE9i中也是吗?
      

  7.   

    偶要做大规模的查询,group by分析,having 等,我将
    db_file_multiblock_read_count=128有没有问题(oracle 9i on HP UX 11)
      

  8.   

    To 楼上:  1. 先说说你的大规模的查询问题     我个人认为设置SORT_AREA_SIZE为一个较大的值基本可以解决你
          的问题,这样,排序操作在内存完成,效率会比较高。问题是
          你怎样确定这个值的范围. 例如100,000,0行 *10列的排序,要求
          内存缓冲区全部装下有点困难(虽然你提取的只是10列,但是排序
          时会以整行的方式加载到内存),因此一个比较科学的计算公式就是
          排序的行*列/SORT_AREA_SIZE的大小=整数n,经过n次调度全部
          装载完毕.  也可能我说的不是很明白,你可以去ITPUB.NET
          看看,里面有专门这方面的文章介绍.     " ...将db_file_multiblock_read_count=128有没有问题"
      ---------------------------------------------------
      可能会有问题, 但是也不绝对。 在有些情况下,全表扫描的效率要
      高于索引读取。   假设:一个表中的一列是这么组成的:
        1,2,3,4, 9991个5,9996,9997,9998,9999,10000   select * from t1 where col=5 
       -----------------------------
        很显然,使用全表扫描的效率高
       
      select * from t1 where col=3
      ----------------------------
       使用INDEX进行扫描效率会好一些  
      

  9.   

    to各位:
    我的回滚段还是没有搞定,以前我在装ORACLE时用部是用默认的,现在建的那个回滚段rb_sh
    不能让它自动在线,我在参数文件中加入了ROLLBACK_SEGMENT=(rb_sh) 以后重新启动服务,提示oracle不可用,不知何故,我也把public去掉了重新建一个,但是现象依旧......
      

  10.   

    参考:
      CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS
    STORAGE ( OPTIMAL 4096K );
    CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS
    STORAGE ( OPTIMAL 4096K );
    ALTER ROLLBACK SEGMENT "RBS0" ONLINE;
    ALTER ROLLBACK SEGMENT "RBS1" ONLINE;-------------------------------------------------------------
     上面的语句是在RBS表空间中创建两个公用的回滚段,并且让它在线;
     记住: 公用回滚段的建立是在建立数据库期间自动完成的,我给
         出的脚本也是从建库脚本中摘录出来的. 创建私有的回滚段不要加public关键字,并且要在init<sid>.ora中
     指定.
      

  11.   

    怎样在init<sid>.ora文件中指定呀,我用的是:ROLLBACK_SEGMENT=(rb_sh) !!
    但是加上这条语句后重启服务,发现用这个用户登陆不了,提示oracle 不可用,但是system等用户还可登陆,删除这条语句后再重启服务,就可恢复。是怎么回事呀,是不是语句有误呀?
      

  12.   


     哦,可能私有回滚段要建在回滚段表空间中吧。
     sh这个表空间是不是回滚段表空间?  还有,指定私有回滚段就是用你现在使用的方法,在init<SID>.ora
      中指定。  rollback_segments = ( RBS0, RBS1,....)