您的位置:首页 > 数据库 > Oracle

oracle学习小结10

2008-07-27 09:08 465 查看
1 打开统计日志信息

set autot on stat

2 ORACLE的内存分配大致小结

SGA的查看:

select * from v$sga;

(注意oracle在unix下是多进程的,在windows下是单进程的)

查看系统实际分配的各类pool

select * from v$sgastat;

sga大小估计:

查看UGA大小

show parameter area_size

windows上存在32bit的限制,如AIX、HP UNIX 等有明确的64BIT OS and ORACLE的版本,32bit oracle可以装在64bit os 上,64 bit oracle不能装在32 bit OS上

不管oracle是32 bit ORACLE还是 64 bit 的,假定应用存在没有很好的使用bind var 的情况,也不能设置 shared_pool_size 过大,通常应该控制在200M--300M,如果是 ORACLE ERP 一类的使用了很多存储过程函数、包 ,或者很大的系统,可以考虑增大shared_pool_size ,但是如果超过500M可能是危险的,达到1G可能会造成CPU的严重负担,系统甚至瘫痪。所以shared_pool_size 如果超过300M还命中率不高,那么应该从应用上找原因而不是一味的增加内存,shared_pool_size 过大主要增加了管理负担和latch 的开销。

log_buffer : 128K ---- 1M 之间通常问题不大,不应该太大

large_pool_size :如果不设置MTS,通常在 RMAN 、OPQ 会使用到,但是在10M --- 50M 应该差不多了。假如设置 MTS,则由于 UGA 放到large_pool_size 的缘故,这个时候依据 session最大数量和 sort_ares_size 等参数设置,必须增大large_pool_size 的设置,可以考虑为 session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTS,我们都不主张使用MTS,尤其同时在线用户数小于500的情况下。

java_pool_size : 若不使用java,给30M通常就够了

data buffer ,在做了前面的设置后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)

在9i 中可以是 db_cache_size

还有2个重要参数我们需要注意

sort_area_size and hash_area_size

这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分

(****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) < 总物理RAM 为好

这样归结过来,假定oracle是 32 bit ,服务器RAM大于2G ,注意你的PGA的情况,,则建议

shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G

再具体化,注意满足上面(****) 的原则的基础上可以参考如下设置

如果512M RAM

建议 shared_pool_size = 50M, data buffer = 200M

如果1G RAM

shared_pool_size = 100M , data buffer = 500M

如果2G

shared_pool_size = 150M ,data buffer = 1.2G

物理内存再大已经跟参数没有关系了

假定64 bit ORACLE

内存4G

shared_pool_size = 200M , data buffer = 2.5G

内存8G

shared_pool_size = 300M , data buffer = 5G

内存 12G

shared_pool_size = 300M-----800M , data buffer = 8G

其中shared_pool_size主要是放已经执行过的SQL语句,是SQL语句的缓冲池

3 内存参数的调整

数据缓冲区命中率

SQL> select value from v$sysstat where name ='physical reads';

VALUE

----------

14764

SQL> select value from v$sysstat where name ='physical reads direct';

VALUE

----------

50

SQL> select value from v$sysstat where name ='physical reads direct (lob)';

VALUE

----------

0

SQL> select value from v$sysstat where name ='consistent gets';

VALUE

----------

167763

SQL> select value from v$sysstat where name = 'db block gets';

VALUE

----------

14305

这里命中率的计算应该是

令 x = physical reads direct + physical reads direct (lob)

命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100

通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区

共享池的命中率

SQL> select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache;

hit radio

----------

99.809291

假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存

关于排序部分

SQL> select name,value from v$sysstat where name like '%sort%';

NAME VALUE

---------------------------------------------------------------- ----------

sorts (memory) 67935

sorts (disk) 1

sorts (rows) 7070

SQL>

假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着

sort_area_size 部分内存较小,可考虑调整相应的参数。

关于log_buffer

SQL> select name,value from v$sysstat

2 where name in('redo entries','redo buffer allocation retries');

NAME VALUE

---------------------------------------------------------------- ----------

redo entries 2325719

redo buffer allocation retries 10

假如 redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer

通常来说,内存的调整的焦点就集中在这几个方面,更多更详细的内容,建议从statspack

入手来一步一步调整。最后关于内存的调整,再强调这一点,一定要结合操作系统来衡量,

任何理论都必须要实践来检验。在操作系统中观察 page in/out 状况,发现问题严重,应

该考虑调小SGA。





4 在调优时,往往要这样做,就是要查出用户的哪条SQL语句慢了,因为一用户发出了很多个事务,每个事务又包含了很多语句,查询的步骤如下

  1)select addr,ses_addr from v$transcation;

查看其addr ses_addr

比如      592bae00

通过ses_addr到session表中去查看由哪个用户发起的transcation,v$session.saddr=v$transcation.ses_addr

2) select saddr,sid,username,status,paddr from v$session;

查出

saddr sid paddr

592bae00 12 692906e8



3) 因为 v$process.addr=v$session.paddr,所以

select addr,spid from v$process

查出    addr spid

592906E8 3797

 4 )  然后用ps -ef |grep 3797 就可以知道起其客户端连接上来的进程号,

     在windows端,用netstat -anp |more

就可知道具体由客户端哪个程序连上来

  5) select sid,pre_sql_addr,username,status from v$session;

查出最近发起的sql

sid prev_sql username

12 5ab0f3ac hr

6) select sql_text,address from v$sql where address='5ab0f3ac';

就查出该SQL了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: