(11.5.9+)
确认当前系统使用的dbc文件.
select host_name||'_'||instance_name from v$instance;
dbc文件的的位置和权限位设置:
ls –al $FND_SECURE/*.dbc (11.5.10+).
owner最好为 applmgr,权限伟644.
用AdminAppServer 验证dbc文件.
java oracle.apps.fnd.security.AdminAppServer apps/vecentli STATUS DBC=/u01/dev/devappl/fnd/11.5.0/secure/testdb.tencent.com_dev.dbc
返回的status必须为valid..
当然,你还要确认系统是否使用这个dbc文件.
在路径$APPL_TOP/admin/[SID]_[host].xml
查找_dbc_file_name,和上面说的dbc文件匹配即可.
修正dbc文件就重新autoconfig了.也可以运行..
$COMMON_TOP/admin/install/adgendbc.sh
感觉知识面广了许多,但专业性却不行了。。像我这样子的?去做售前是否更好一点呢?能吹,而且吹的也不会很水。。
准备近期就rman,data guard,rac,ERP的sysadmin模块,还有shell编程深入系统的总结一下。
查看全文1:
SELECT
TO_NUMBER(SUBSTRdbms_session.unique_session_id,1,4),'XXXX') FROM DUAL ;
备注:
以下方法获取的不是当前用户的sid.
select SYS_CONTEXT('USERENV','SESSIONID') sessionid
from dual
而是audit session id。
SYS_CONTEXT('USERENV','SESSIONID') = v$session.AUDSID
参见:
http://www.itpub.net/showthread.php?=&postid=2888443#post2888443
1、建立测试表
CREATE TABLE student
(
id NUMBER,
name VARCHAR2(30),
sex VARCHAR2(10),
address VARCHAR2(100),
postcode VARCHAR2(10),
birthday DATE,
photo LONG RAW
)
/
2、建立带ref cursor定义的包和包体及函数:
CREATE OR REPLACE
package pkg_test as
/* 定义ref cursor类型
不加return类型,为弱类型,允许动态sql查询,
否则为强类型,无法使用动态sql查询;
*/
type myrctype is ref cursor;
--函数申明
function get(intID number) return myrctype;
end pkg_test;
/
CREATE OR REPLACE
package body pkg_test as
--函数体
function get(intID number) return myrctype is
rc myrctype; --定义ref cursor变量
sqlstr varchar2(500);
begin
if intID=0 then
--静态测试,直接用select语句直接返回结果
open rc for select id,name,sex,address,postcode,birthday from student;
else
--动态sql赋值,用:w_id来申明该变量从外部获得
sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id';
--动态测试,用sqlstr字符串返回结果,用using关键词传递参数
open rc for sqlstr using intid;
end if;
return rc;
end get;
end pkg_test;
/
3、用pl/sql块进行测试:
declare
w_rc pkg_test.myrctype; --定义ref cursor型变量
--定义临时变量,用于显示结果
w_id student.id%type;
w_name student.name%type;
w_sex student.sex%type;
w_address student.address%type;
w_postcode student.postcode%type;
w_birthday student.birthday%type;
begin
--调用函数,获得记录集
w_rc := pkg_test.get(1);
--fetch结果并显示
fetch w_rc into w_id,w_name,w_sex,w_address,w_postcode,w_birthday;
dbms_output.put_line(w_name);
end;
4、测试结果:
通过。
在上述的online document中有相当多的内容,包括怎样在pro*c传递动态参数给存储过程、ref cusor的使用限制、open cursor for的4中不同方法等等。
这是我一直以来对hard parse和soft parse的理解。。
以下是5个步骤。。
1:语法是否合法。(sql写法)
2:语义是否合法。(权限,对象是否存在)
3:检查该sql是否在公享池中存在.
//如果存在存在,直接跳过3和4,运行sql. 此时算soft parse。
//如果5个步骤全做,这就叫hard parse.
4:选择执行计划。
5:产生执行计划。
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C
ocuments and Settingsvecentli>sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 7月 13 09:32:28 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn sys/********@oravis as sysdba
已连接。
SQL> grant select any table to ap;
授权成功。
SQL>
SQL> conn ap/********@oravis;
已连接。
SQL> desc tab
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
TNAME NOT NULL VARCHAR2(30)
TABTYPE VARCHAR2(7)
CLUSTERID
SQL> select count(*)
2 from tab;
COUNT(*)
----------
255
SQL> desc scott.tab
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
TNAME NOT NULL VARCHAR2(30)
TABTYPE VARCHAR2(7)
CLUSTERID NUMBER
SQL> select *
2 from scott.tab
3 ;
from scott.tab
*
ERROR 位于第 2 行:
ORA-00942: 表或视图不存在
SQL>
SQL> conn sys/************@oravis as sysdba
已连接。
SQL> desc tab
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
TNAME NOT NULL VARCHAR2(30)
TABTYPE VARCHAR2(7)
CLUSTERID NUMBER
SQL> desc scott.tab
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
TNAME NOT NULL VARCHAR2(30)
TABTYPE VARCHAR2(7)
CLUSTERID NUMBER
SQL> select *
2 from scott.tab;
from scott.tab
*
ERROR 位于第 2 行:
ORA-00942: 表或视图不存在
SQL>
dba权限的用户也不可以。。
只能desc其他用户的tab,而不能select其他用户的tab。。
看来不是权限的问题,难道oracle限制了这个做法?
----回过头来看看视图定义。
select o.name,
decode(o.type#, 2, 'TABLE', 3, 'CLUSTER',
4, 'VIEW', 5, 'SYNONYM'), t.tab#
from sys.tab$ t, sys.obj$ o
where o.owner# = userenv('SCHEMAID')
and o.type# >=2
and o.type# <=5
and o.linkname is null
and o.obj# = t.obj# (+);
肯定这个 userenv('SCHEMAID') 破玩意在作怪!
SQL> select userenv('SCHEMAID')
2 from dual;
USERENV('SCHEMAID')
-------------------
0
SQL>
SCHEMAID的解释.
SCHEMAID returns the id of the schema for the current user. This id is used, for example, in obj$ (column owner#).
select userenv('SCHEMAID') from dual;
--可是为什么会报 表或视图不存在的错误呢?应该是未选定行才对啊?!
猜测:
根椐下面的试验,我猜测DESC时如果指定了方案限定词时是查找用户的表,视图,私有同义词或者公有同义词,而SELECT的时候,如果指定了方案限定词,不会去查找公有同义词,所以才有这样的差别。
SQL> show user
USER is "WYQ"
SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
PLAN_TABLE
T
SQL> desc t
Name Null? Type
----------------------------------------------------------------------- -------- ------------------------------------------------
X NOT NULL NUMBER
Y VARCHAR2(128)
SQL> create synonym syn_t for t;
Synonym created.
SQL> conn sys/wyq as sysdba
Connected.
SQL> desc wyq.syn_t
Name Null? Type
----------------------------------------------------------------------- -------- ------------------------------------------------
X NOT NULL NUMBER
Y VARCHAR2(128)
SQL> select count(*) from wyq.syn_t;
COUNT(*)
----------
100
SQL> conn wyq/wyq
Connected.
SQL> drop synonym syn_t;
Synonym dropped.
SQL> create public synonym syn_t for t;
Synonym created.
SQL> conn sys/wyq as sysdba
Connected.
SQL> desc wyq.syn_t;
Name Null? Type
----------------------------------------------------------------------- -------- ------------------------------------------------
X NOT NULL NUMBER
Y VARCHAR2(128)
SQL> select count(*) from wyq.syn_t;
select count(*) from wyq.syn_t
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>
--做个trace验证一把。
sqlplus " /as sysdba"
alter session set events '10046 trace name context forever,level 12'
;
desc sys.TT (there's no object name TT in my db)
exit
some thing in the trace file.
PARSING IN CURSOR #1 len=198 dep=1 uid=0 oct=3 lid=0 tim=2205811854802 hv=2703824309 ad=
'91cfeb40'
select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$, spare1, spare2 from obj$
where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is nu
ll and subname is null
END OF STMT
PARSE #1:c=0,e=3248,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,tim=2205811854790
BINDS #1:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d069640 bln=22 avl=03 flg=05
value=0
bind 1: dty=1 mxl=32(02) mal=00 scl=00 pre=00 oacflg=18 oacfl2=1 size=32 offset=0
bfp=ffffffff7d069608 bln=32 avl=02 flg=05
value="TT"
bind 2: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d0695d8 bln=24 avl=02 flg=05
value=1
EXEC #1:c=10000,e=3068,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=3,tim=2205811858366
FETCH #1:c=0,e=310,p=0,cr=3,cu=0,mis=0,r=0,dep=1,og=3,tim=2205811858772
BINDS #1:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d069640 bln=22 avl=02 flg=05
value=1
bind 1: dty=1 mxl=32(02) mal=00 scl=00 pre=00 oacflg=18 oacfl2=1 size=32 offset=0
bfp=ffffffff7d069608 bln=32 avl=02 flg=05
value="TT"
bind 2: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d0695d8 bln=24 avl=02 flg=05
上面红色部分是owner# 的bind 值
1 select name,user#
2* from user$ where user# in (0,1)
SQL> /
PUBLIC 1
SYS 0
可以看出,Oracle先根据“SYS”(owner#=0) 找,没找到,于是就到“public” (owner#=1) 里找
....
--继续做select的trace。
SQL> alter session set events '10046 trace name context forever,level 12'
2 /
Session altered.
SQL> select * from sys.TT
2 /
select * from sys.TT
*
ERROR at line 1:
ORA-00942: table or view does not exist
可以方向在trace file里只找了"SYS”(owner#=0) 的object
PARSING IN CURSOR #3 len=198 dep=1 uid=0 oct=3 lid=0 tim=2206623598500 hv=2703824309 ad=
'91cfeb40'
select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$, spare1, spare2 from obj$
where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is nu
ll and subname is null
END OF STMT
PARSE #3:c=0,e=139,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=3,tim=2206623598489
BINDS #3:
bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d068d78 bln=22 avl=01 flg=05
value=0
bind 1: dty=1 mxl=32(02) mal=00 scl=00 pre=00 oacflg=18 oacfl2=1 size=32 offset=0
bfp=ffffffff7d068d40 bln=32 avl=02 flg=05
value="TT"
bind 2: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=08 oacfl2=1 size=24 offset=0
bfp=ffffffff7d068d10 bln=24 avl=02 flg=05
value=1
EXEC #3:c=0,e=621,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=3,tim=2206623599523
FETCH #3:c=0,e=252,p=0,cr=3,cu=0,mis=0,r=0,dep=1,og=3,tim=2206623599848
=====================
PARSE ERROR #2:len=21 dep=0 uid=0 oct=3 lid=0 tim=2206623600042 err=942
select * from sys.TT
conclusions:
DESC时如果指定了方案限定词时是查找用户的表,视图,私有同义词或者公有同义词,而SELECT的时候,如果指定了方案限定词,不会去查找公有同义词,所以才有这样的差别。
出现ora_04031 非常有可能是共享池碎片严重。或者shared_pool/java pool太
小。一般来说,重启或者执行 alter system flush shared_pool;语句就可
以解决。建议做个statspack看看,查找可能的原因。
前段时间看到了pub上有人问如何跟踪绑定变量的值。当时也没有想到办法,今天再看跟踪事件,
发现了设置10046事件并且level大于4能显示绑定变量的详细信息,但是否有绑定变量的值呢?我试了一下。结果如下:
对当前session,设置10046事件,ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 4';
执行如下pl/sql,
declare
v_birth date:=sysdate;
v_accounts char(10):= 'lijietz' ;
begin
insert into lijietz values(v_birth, v_accounts);
end;
然后到user_dump_dest下找trace文件.大概内容如下:
PARSING IN CURSOR #2 len=36 dep=1 uid=0 oct=2 lid=0 tim=18446744073296766171 hv=507792077 ad='65e33520'
INSERT into lijietz values(:b2, :b1)
END OF STMT
PARSE #2:c=0,e=286,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=0,
tim=18446744073296766163
BINDS #2:
bind 0: dty=12 mxl=07(07) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=8 offset=0
bfp=09a201f4 bln=07 avl=07 flg=09
value="5/31/2005 15:12:9"
bind 1: dty=96 mxl=32(10) mal=00 scl=00 pre=00 oacflg=13 oacfl2=1 size=32 offset=0
bfp=09a201d8 bln=32 avl=10 flg=09
value="lijietz"
EXEC #2:c=31250,e=26379,p=0,cr=1,cu=2,mis=0,r=1,dep=1,
og=4,tim=18446744073296810934
EXEC #1:c=46875,e=52807,p=0,cr=1,cu=2,mis=0,r=1,dep=0,
og=4,tim=18446744073296814766
解析后的语句 INSERT into lijietz values(:b2, :b1) ,
搜索值'lijietz', value="lijietz",相同的找到了value="5/31/2005 15:12:9",注意tkprof
以后就找不到了绑定变量的值了。
最后关闭跟踪事件alter session set events '10046 trace name context off';
联接地址:http://www.itpub.net/showthread.php?s=&postid=2574881#post2574881
一:SQL tuning 类
1:列举几种表连接方式
答:mj,hj,nl
2:不借助第三方工具,怎样查看sql的执行计划
答:autotrace /utlxplan.sql
3:如何使用CBO,CBO与RULE的区别
答:在初始化参数里面设置optimizer_mode=choose/all_rows/first_row等可以使用cbo.
rbo会选择不合适的索引,cbo需要统计信息。
4:如何定位重要(消耗资源多)的SQL
答:根据v$sqlarea 中的逻辑读/disk_read。
5:如何跟踪某个session的SQL
答:先找出对应的'sid,serial',然后调用system_system.set_sql_trace_in_session(sid,serial,true);
6:SQL调整最关注的是什么
答:逻辑读。
7:说说你对索引的认识(索引的结构、对dml影响、对查询影响、为什么提高查询性能)
答:默认的索引是b-tree.
对insert的影响.(分裂,要保证tree的平衡)
对delete的影响.(删除行的时候要标记改节点为删除).
对update的影响,如果更新表中的索引字段,则要相应的更新索引中的键值。
查询中包含索引字段的键值和行的物理地址。
8:使用索引查询一定能提高查询的性能吗?为什么
答:不能。如果返回的行数目较大,使用全表扫描的性能较好。
9:绑定变量是什么?绑定变量有什么优缺点?
答:通俗的说,绑定变量就是变量的一个占位符,使用绑定变量可以减少只有变量值不同的
语句的解析。
10:如何稳定(固定)执行计划
答:使用stored outline.
11:和排序相关的内存在8i和9i分别怎样调整,临时表空间的作用是什么
答:8i:使用sort_area_size,hash_area_size,每个session分配相同的值,不管有无使用。
9i: 使用pga_aggregate来统一管理。
临时表空间的作用:
在sort_area_size中不能完成的部分在临时表空间完成,临时表空间在重建索引,创建临时表等都要用到。
还有hash join不能完成的也在临时表空间中做。
12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql
select a,b,c,d from (select a,b,c,d from T order by c) where rownum<=30
minus
select a,b,c,d from (select a,b,c,d from T order by c) where rownum <=20;
二:数据库基本概念类
1
ctused and pctfree 表示什么含义有什么作用
答:表示数据块什么时候重联接或者从freelist中删除。
pctused:如果数据块的使用小于pctused的值,则该数据块重新加入到fresslist中。
pctused:如果数据块的空闲空间小于pctfree的值,则该数据块从freelist中删除。
2:简单描述table / segment / extent / block之间的关系
答:table是一个逻辑上的概念。
segment表示结构的相同的一段空间。
extent。多个block组成一个extent,便于dbms分配。
block,多个os块组成一个block,是oracle i/o的单位。
3:描述tablespace和datafile之间的关系
答:
tablespace是逻辑上的概念,datafile是物理上的概念。
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。
4:本地管理表空间和字典管理表空间的特点,ASSM有什么特点
答:一个使用freelist管理,一个使用位图管理。
5:回滚段的作用是什么
答:保存数据的前像,保证数据读取的时间点一致性。
6:日志的作用是什么
答:纪录对数据库的操作,便与恢复。
7:SGA主要有那些部分,主要作用是什么
答:db_cache(缓存数据块),shared_pool(缓存sql,执行计划,数据字典信息等),large_pool(rman要用到),java pool(java程序时要用到)
8:racle系统进程主要有哪些,作用是什么
答:smon(合并空间,实例恢复),pmon(清理失败的进程),归档进程(负责在日志切换的时候归档日志文件),lgmr(日志书写器进程,负责
写日志咯),
ckpt(检查点进程,触发检查点),dbwr(数据库写入器,负责把数据写入导datafile)
三:备份恢复类
1:备份如何分类
答:逻辑备份(exp)与物理备份。
或者冷备份与热备份。
2:归档是什么含义
答:把日志文件放到另一个地方。
3:如果一个表在2004-08-04 10:30:00 被drop,在有完善的归档和备份的情况下,如何恢复
答:
拷贝备份,
recove database until time 2004-08-04 10:30:00
alter database open resetlogs;
4:rman是什么,有何特点
答:rman叫恢复管理器.
特点很多。
1:热备份。
2:可以存储脚本。
3:可以增量备份。
4:自动管理备份集。
5:standby的特点
答:利用传输重做日志来达到同步的目的。
6:对于一个要求恢复时间比较短的系统(数据库50G,每天归档5G),你如何设计备份策略
答:每天一个全备份。
四:系统管理类
1:对于一个存在系统性能的系统,说出你的诊断处理思路
答:做一个statspack,根据top 5,system load,top sql等来做相应的调整。
2:列举几种诊断IO、CPU、性能状况的方法
答:
hp-unix:iostat -x 1 5;
top/vmstat/glance
3:对statspack有何认识
答:
一个性能诊断工具而已咯,其本质就是在两个时间点采样两个系统数据。(动态性能视图)
然后根据两个snapshot,产生一个报告。
4:如果系统现在需要在一个很大的表上创建一个索引,你会考虑那些因素,如何做以尽量减小对应用的影响
答:
1:增大sort_area_size(8i)/pga_aggregate_target(9i)值。
2:用并行的方式来建。
3:系统空闲的时候建。
5:对raid10 和raid5有何认识
答:raid5写入慢。raid10不了解。
五:综合随意类
1:你最擅长的是oracle哪部分?
答:性能/sql 调优。
2:喜欢oracle吗?喜欢上论坛吗?或者偏好oracle的哪一部分?
答:http://www.itpub.net/forum2.html
3:随意说说你觉得oracle最有意思的部分或者最困难的部分
答:性能调优。
4:为何要选择做DBA呢?
答:自己爱好加上稍高的工资
如何在SQL*PLUS中使用Autotrace?
sqlplus system
SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql
SQL> create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
SQL> conn sys
SQL> @$ORACLE_HOME/sqlplus/admin/plustrce
SQL> grant plustrace to public;
SET AUTOTRACE OFF | ON EXPLAIN | ON STATISTICS | ON | TRACEONLY | TRACE EXPLAIN
AUTOTRACE是要实际执行一个查询的。
要启用远程控制数据库的功能,
SQLNET.AUTHENTICATION_SERVICES =none
and
remote_login_passwordfile='EXCLUSIVE'
就可以了。
Use the parameter SQLNET.AUTHENTICATION_SERVICES to enable one or more authentication services. If authentication has been installed, it is recommended that this parameter be set to either none or to one of the authentication methods.
Values:Authentication Methods Available with Oracle Net Services:
·NONE for no authentication methods. A valid username and password can be used to access the database.
·ALL for all authentication methods
·NTS for Windows NT native authentication
纪录于此,供以后查阅。
1 红帽群集套件配置和管理群集
http://www.dvdshop.com.cn/manual/redhat_AS_3.0_CS/
2 红帽企业Linux4各体系的安装指南
http://www.dvdshop.com.cn/manual/rhel-ig-x8664-multi-zh_cn-4/
3 红帽企业Linux4安全指南
http://www.dvdshop.com.cn/manual/rhel-sg-zh_cn-4/
4 红帽企业Linux4用于IBM体系的安装指南
http://www.dvdshop.com.cn/manual/rhel-ig-s390-multi-zh_cn-4/
5 红帽企业Linux4系統管理導論
http://www.dvdshop.com.cn/manual/rhel-isa-zh_tw-4/
truncate,delete,drop的比较.
注意:这里说的delete是指不带where子句的delete语句
相同点:truncate和不带where子句的delete, 以及drop都会删除表内的数据
不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是DML,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
truncate,drop是DDL, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
显然drop语句将表所占用的空间全部释放
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据
等待事件(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。
--求等待事件及其对应的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#(+);
--求等待事件及其热点对象
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;
--综合以上两条sql,同时显示latch及热点对象(速度较慢)
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;
--如果是非空闲等待事件,通过等待会话的sid可以求出该会话在执行的sql
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;
通过等待事件找出系统中消耗资源较严重的sql,是dba进行系统诊断的手段之一。只是过程稍嫌烦琐,由于session是动态的、瞬息万变、不可捕获,当你想捕获时,该session可能已经释放,但这种捕获很有针对性;也可以通过对v$sql或v$sqlarea进行过滤,找出存在性能问题的sql,长时间地对v$sql进行监控,并对捕获的sql进行优化处理,可以在很大程度上解决系统的性能问题。










