|
第一部分见http://blog.itpub.net/post/96/2265
基于等待事件的性能诊断方法 等待事件(wait event)是oracle核心代码的一个命名部分,有两种类型的等待事件:空闲事件(idle event)与非空闲事件(non-idle event),空闲事件指oracle正在等待某种工作,常见的空闲等待事件:client message、null event、pipe get、pmon/smon timer、rdbms rpc message及sql*net等;非空闲等待事件:buffer busy waits、db file scattered read、db file sequential read、enqueue、free buffer waits、latch free、log file sync、log file paralle write等。
什么是瓶颈?一旦熟悉了系统的等待事件,就能够把握问题的关键,并能够用相应的方法去处理阻塞系统的瓶颈,一定不要随意的进行优化,否则一波不行又起一波,可以通过v$system_event熟悉系统总的等待情况,然后通过v$session_event查看系统中session的待情况,最后通过v$session_wait定位瓶颈对象。v$session_wait是会话级的,它包含session的实时信息,最重要的是:它显示了等待事件与相应资源的更深入信息,可明确地定位出要优化的范围。 v$session_wait的p1、p2、p3告诉我们等待事件的具体含义,如果wait event是db file scattered read,p1=file_id/p2=block_id/p3=blocks,然后通过dba_extents即可确定出热点对象;如果是latch free的话,p2为闩锁号,它指向v$latch。 col event format a32 col name format a32 select sid,event,p1 as file_id, p2 as "block_id/latch", p3 as blocks,l.name from v$session_wait sw,v$latch l where event not like '%SQL%' and event not like '%rdbms%' and event not like '%mon%' and sw.p2 = l.latch#(+); --求等待事件及其对应的latch col owner format a18 col segment_name format a32 col segment_type format a32 select owner,segment_name,segment_type from dba_extents where file_id=&file_id and &block_id between block_id and block_id + &blocks - 1; --求等待事件及其热点对象 select sw.sid,event,l.name,de.segment_name from v$session_wait sw,v$latch l,dba_extents de where event not like '%SQL%' and event not like '%rdbms%' and event not like '%mon%' and sw.p2 = l.latch#(+) and sw.p1 = de.file_id(+) and p2 between de.block_id and de.block_id + de.blocks - 1; --综合以上两条sql,同时显示latch及热点对象(速度较慢) select sql_text from v$sqltext_with_newlines st,v$session se where st.address=se.sql_address and st.hash_value=se.sql_hash_value and se.sid =&wait_sid order by piece; --如果是非空闲等待事件,通过等待会话的sid可以求出该会话在执行的sql 通过等待事件找出系统中消耗资源较严重的sql,是dba进行系统诊断的手段之一,只是过程稍嫌烦琐,由于session是动态的,往往是瞬息万变,不可捕获(但有针对性),但可能通过对v$sql或v$sqlarea进行过滤,按[如何对sql进行调整及优化]一节中提供的sql可以找出存在性能问题的sql,长时间地对v$sql进行捕获,并对抓到的sql进行分析处理,可以在很大程度上解决性能问题。 基于资源限制的性能诊断方法 如果想用resource limit功能,就必须将初始化参数resource_limit=true,当然也可以指定相关的resource_manager_plan参数更细致地管理资源;针对某个用户的资源限制,可以通过用户的profile来实现。关于create profile,可以见tahiti中的相关文档。如果不想创建profile,你可以使用默认的profile,每个用户在创建时如果没有指定profile,都将使用默认的profile。如果你新创建了profile,可以用alter user &user_name profile &profile_name的方法为用户指定新的profile;必须对profile中的每项的含义及导致的后果比较清楚,否则设置不当,你将承担被客户投诉的待遇,通过dba_profiles/dba_users字典可以查出所有profile的设置信息。 关于存储结构在数据库设计上的作用 理解oracle的存储结构在数据库(建模)设计上有一定的指导意义,在没有争议的字段上,相信大家都可以为字段选择正确的数据类型,但在有些情况下就需要对存储原理有一定的理解,比如char(1)与number(1)谁更合适一些呢?char(1)比number(1)在取值上有更多的选择空间,而且存储方面也比number(1)少一个字节,但char(1)与number(1)在性能上讲,并没有多大的差别,无非数字的换算公式比字符复杂一些而已。 create table t1(id char(1),id2 number(1)) select id,dump(id) did,id2,dump(id2) did2,to_char(193,'xx') hex from t1; I DID ID2 DID2 HEX - ------------------ --- ------------------ --- ------ a Typ=96 Len=1: 97 1 Typ=2 Len=2: 193,2 c1 http://www.itpub.net/211094.html 这是关于数据类型的存储原理的一个贴子,它给出了不同数据类型逆向计算公式,字符型的比较好理解,存储时就是存的字符的ascii码值,上面给出的显然已经被转换成十进制,但在数据文件中存储的应该是十六进制的;数字的存储就比较复一些,将193,2转换成十六进制为c1 02,然后用本人写的函数uf_dec求出实际写入表中的数据,http://blog.itpub.net/post/96/2240 这个贴子中是转换函数uf_dec,可以将十六进制串转为十进制。 可以到tahiti上查关于对象的compress属性介绍的贴子,table、index等对象可以启用compress属性而减轻对disk space的需求。通过下面两个列子可以看出,compress属性对disk space可以大幅度减少,cpu的使用比nocompress略高。 SQL> create table compress_1 compress as select * from dba_objects; SQL> create table compress_2 as select * from dba_objects; SQL> exec show_space('compress_1','auto'); Total Blocks............................64 Total Bytes.............................524288 Unused Blocks...........................6 Unused Bytes............................49152 Last Used Ext FileId....................5 Last Used Ext BlockId...................544 Last Used Block.........................2 SQL> exec show_space('compress_2','auto'); Total Blocks............................256 Total Bytes.............................2097152 Unused Blocks...........................110 Unused Bytes............................901120 Last Used Ext FileId....................5 Last Used Ext BlockId...................11656 Last Used Block.........................18 好象show_space过程来自http://asktom.oracle.com,它通过对dbms_space package的调用,更好地将table/index的存储信息展示出来,http://www.itpub.net/239697.html 这个贴子详细地讨论了show_space过程的使用方法,而且还有些网友对这个过程进行了改进,希望对你有所帮助。 关于在线重定义table的建议 在线重定义表是9i的新功能,可以在系统繁忙的情况下,对表进行重组,消除表中的碎片,http://www.cnoug.org/viewthread.php?tid=1680 这是piner写的关于在线重定义表的一个贴子,非常详细地介绍了在线重定义表的过程,偶就不多说了,简单地介绍一下本人使用在线重定义表的经验与教训。 表经过重定义以后,发现以前一些允许为空的字段被dbms_redefinition package改为not null啦,结果有一些sql报错,而且一个非常重要的字段的默认值也被重定义过程搞没有啦,结果造成系统被hang住,所以使用在线重定义表时一定要小心,确信在线重定义的过程没有改变你不希望他更改的部分。 关于分区表在数据库设计时的建议 如果表中预期的数据量较大,通常都需要考虑使用分区表,确定使用分区表后,还要确定什么类型的分区(range partition、hash partition、list partition等)、分区区间大小等。分区的创建最好与程序有某种默契,偶曾经创建分区表,按自然月份定义分区的,但程序却在查询时默认的开始时间与结束时间是:当前日期-30至当前日期,比如当天是9.18号,那查询条件被产生为8.18-9.18,结果分区后并不没有大幅提高性能,后来对程序的查询日期做了调整,按自然月查询,系统的负载小了很多。 关于分区表的一些操作,请参考这个贴子 http://www.itpub.net/221061.html 关于dataguard在高可用方面的建议 dataguard是oracle推出的一种高可用性(high available)方案,在主节点与备用节点间通过日志同步来保证数据的同步,备用节点作为主节点的备份,可以实现快速切换与灾难性恢复,9.2.0开始,dataguard支持逻辑备用库。物理备用库最大限度地保障数据安全,减少系统停机时间;逻辑备用库可以允分利用硬件投资,承担系统中的报表服务,关于dataguard的配置,参考piner的贴子 http://www.cnoug.org/viewthread.php?tid=22640
|