○、案例分析:(2010-03-03)
因为执行HIS程序太慢,医院HIS的护理管理完成“一日清单批量打印”需要3分40秒,而且一旦执行此项操作就会让服务器硬盘满负荷(根据查看MS自带的性能监视器),其它HIS用户,如门诊,住院收费都会
卡住,每做一项操作(如项目显示,保存)都要等几秒钟。所以我们认为需要升级医院HIS服务器,尤其是更换高I/0速度的硬盘或增加磁盘阵列柜。呵呵,造的升级服务器预算达10万!
但有专家提醒,增加内存,调整oracle,让执行HIS程序所需要的数据来自内存,而不去费时地读硬盘来获取。
最后的疑问就是:医院HIS服务器太慢需要升级,但不知道仅仅靠增加内存是否就能完成?
一、oracle数据库的内存结构即SGA
它包含数个重要区域分别是:Database Buffer Cache (数据库缓冲区);Redo Log Buffer (重做日志缓冲区);Shared Pool (共享区);其它,如Java pool, Large pool
二、Database Buffer Cache (数据库缓冲区)
数据库缓冲区的作用主要是在内存中缓存从数据库中读取的数据块。数据库缓冲区越大,为用户已经在内存里的共享数据提供的内存就越大,这样可以减少所需要的磁盘物理读。
在9i以前数据库缓冲区的大小是由db_block_buffers*db_block_size来决定大小的。db_block_size参数是在创建数据库时设置的,OLTP系统的db_block_size一般设置为8k。
在9i中,数据库缓冲区的大小由db_cache_size决定,8i中的db_block_buffers被取消。db_cache_size的单位是字节,它直接决定了数据库缓冲区的大小,而不再是块的数量。
三、如何查看sga,db_block_size,db_block_buffers
SQL> show sga
SQL> show parameter db_block_size;
SQL> show parameter db_block_buffers;
Total System Global Area 530020380 bytes
Fixed Size 75804 bytes
Variable Size 120266752 bytes
Database Buffers 409600000 bytes
Redo Buffers 77824 bytes
四、如何修改8i数据库缓冲区(data buffer cache)的大小
修改init.ora文件(路径例如$OracleHome/admin/tyyb/pfile/inittyyb.ora)
中的:
db_block_buffers = ******
最后重启实例即可。
五、Data buffer命中率检查(没怎么用,因为白天和晚上命中率的变化好大)
语句如下:
select 1 - ((physical.value - direct.value - lobs.value) / logical.value)
2 "Buffer Cache Hit Ratio"
3 from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical
4 where physical.name = 'physical reads'
5 and direct.name='physical reads direct'
6 and lobs.name='physical reads direct (lob)'
7 and logical.name='session logical reads';
调整原则:
命中率不应该低于90%.
如果该值过低,应该调高初始化参数。8i调整db_block_buffer,9i调整db_cache_size。
六、创建数据库(Database Configuration Assistant)时,亦可设置
创建数据库时有一个步骤是用来配置SGA参数信息的。如图,这里设置的块大小(字节)就是db_block_size参数,为4k
块缓冲区就是db_block_buffers参数,为77691
这样Database Buffers就为:4096* 77691= 318,222,336
七、结合我们医院HIS数据库服务器的实际应用
服务器先前的DatabaseBuffers为94M,我根据服务器新增1G内存后,尚有400M空闲,把DatabaseBuffers增加380M,调至474M。(具体就是在init.ora中增加db_block_buffers的值)
结果: ^_^
之前医院HIS完成“一日清单批量打印”需要3分40秒(数据完全靠读硬盘)。
现在,执行一次“一日清单批量打印”(也就是将相关数据全部存储在内存的SGA中)以后,再执行“一日清单批量打印”就只要3秒钟了~
2012-07-24
现在服务器又开始慢了,药房发药要等几分种。
查看sga,db_block_size,db_block_buffers
SQL> show sga
SQL> show parameter db_block_size;
SQL> show parameter db_block_buffers;
Total System Global Area 526395380 bytes
Fixed Size 75804 bytes
Variable Size 120266752 bytes
Database Buffers 473997312 bytes
Redo Buffers 77824 bytes
db_block_size 4096
db_block_buffers 115722
服务器的物理内存是 2000M
已用 1078M
这样就有922M 空闲空间,再给database buffers700M,达到1200M左右。(1173997312=4096*286620.4375)
那么db_block_buffers 就应该调整为286620
注意,关闭实例时,千万别选“正常关闭”,因为很可能是无限期等待,用户断开连接