我建了一个数据库,在建立的时候都是用的默认设置,但是现在发觉在删除文件时只能删除大约5000条数据,当删除的数据数量大于5000时等再长的时间都没有反应,而且删除了5000条数据,就要COMMIT一次,否则也是无法删除数据,我想可能是缓冲区太小的缘故,但是我不知道怎样去解决,请高手指教!!谢谢!!
解决方案 »
- oracle查询
- 求解:关于ORACLE的一个sql实现问题
- Oracle中存汉字乱码如何解决
- 大哥,怎么登录Oracle???
- 多表关联的Update更新很慢,怎么办?
- 在oracle下,刪除一表裡的內容時,在沒有寫觸發器的情況另一表的內容也刪除了,為什麼?
- Oracle8.05倒出的dmp文件怎样导入oracle8i?
- 机器安装了Oracle8.05,卸载后安装8.16,安装过程正常,但不能启动服务OracleOraHome81ManagementServer,请高手指点
- 为Oracle配置防火墙问题,急急急
- rac的grid infrastructure,在第二个节点执行root.sh报错,
- ORACLE高手请进,分数不够再加...
- 高手帮忙啊,怎么在两台oracle734上做对称复制啊,两个库是相同的。
还有,怎样用命令来修改呢??
不是缓冲区太小,而是回滚段太小,因为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.
去看看这方面的资料吧.
db_block_size:数据块大小,参数是在创建数据库是设置的,他决定了数据库里每个块的大小
db_block_buffers:数据块缓冲大小,设置数据块在系统全局区里的高速缓存的大小
shared_pool_size:共享池大小,设置系统全局区里的共享池的大小
log_buffer:设置系统全局区里的重写日志缓冲器的大小
rollback_segments:数据库回滚段的大小,这个参数设置不当往往会引起事务处理的I/O瓶颈
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不可用!!
请问各位高手一个,怎样设置回滚段呀。我这样设置为何不行???
最好设置成三个,这样,如果一个你的控制文件如果损坏了,还可以使用另外两个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 关键字去掉.
有点偏大,会造成使用全表扫描,而不是使用索引那位大虾解释一下?在ORACLE9i中也是吗?
db_file_multiblock_read_count=128有没有问题(oracle 9i on HP UX 11)
的问题,这样,排序操作在内存完成,效率会比较高。问题是
你怎样确定这个值的范围. 例如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进行扫描效率会好一些
我的回滚段还是没有搞定,以前我在装ORACLE时用部是用默认的,现在建的那个回滚段rb_sh
不能让它自动在线,我在参数文件中加入了ROLLBACK_SEGMENT=(rb_sh) 以后重新启动服务,提示oracle不可用,不知何故,我也把public去掉了重新建一个,但是现象依旧......
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中
指定.
但是加上这条语句后重启服务,发现用这个用户登陆不了,提示oracle 不可用,但是system等用户还可登陆,删除这条语句后再重启服务,就可恢复。是怎么回事呀,是不是语句有误呀?
哦,可能私有回滚段要建在回滚段表空间中吧。
sh这个表空间是不是回滚段表空间? 还有,指定私有回滚段就是用你现在使用的方法,在init<SID>.ora
中指定。 rollback_segments = ( RBS0, RBS1,....)