在oracle中,和用户有关的表有三种:用户自己创建的表,数据字典视图,动态性能视图。在后2种视图中,用户可以查询自己关心的信息。数据字典是一种系统表,它在数据库被创建时自动产生,由数据库服务器进行维护和更新。有三类主要的数据字典视图,这些视图名称分别以以下标识符开始:
- user_ : 存储当前用户所拥有的某类对象信息
- all_ : 存储当前用户有权访问的某类对象信息
- dba_ : 存储数据库中所有的某类对象信息,仅管理员可以访问。
user_objects 当前用户所拥有的所有对象的信息。
user_tables 当前用户所拥有的表的信息。
all_tables 当前用户可以访问的表信息,包括自己的表和其他用户授权该用户可以访问的表
1. 常用的动态性能视图:
v$sql: 常和v$session一起使用来获取当前会话中的sql执行和这条sql运行了多长时间或者它在等待什么事件。
- 先找到用户的sid:select sid, machine,program,module from v$session;
- 获取某session正在执行的sql,执行时间和等待事件:select a.sql_text,b.status,b.last_call_et,b.event from v$sql a, v$session b where a.sql_id=b.sql_id and b.sid=[SID];
- 查询sql语句消耗的cpu时间和执行时间,就可以大概知道sql语句在执行中是否有长时间等待事件:select sql_text,cpu_time/(1000*1000) t_cpu,trunc(elapsed_time/(1000*1000)) t_elap,(cpu_time/elapsed_time/(1000*1000))*100 pct from v$sql where sql_text like 'insert into t %';
不是所有的sql语句都可以从v$sql中找到,因为oracle会动态更新共享池的信息,一些过旧的sql语句会从共享池剔除,以便新的sql语句提供共享池的空间。可以使用手工方式清除共享池中信息:alter system flush shared_pool;
v$sql_shared_cursor: 存放sql在执行过程中游标共享的信息,可以帮助分析为什么有些看起来“一样”的sql却没有共享的原因。
v$session: 定位用户的会话信息。select sid, machine,program,module from v$session;
v$sessstat: 记录某个session从运行以来的各种资源统计数据,通过关联表v$statsname可以查询出某个session资源的消耗情况。
- select a.sid,b.name,a.value from v$sesstat a,v$statname b where a.sid=[SID] and a.statistic#=b.statistic# and b.name in ('consistent gets', 'physical reads', 'parse count(total)', 'parse count(hard)');
v$session_wait: 记录会话的等待信息,这些等待信息在v$session里也可以查看到。
2. 性能参数指它的设置会对数据库性能问题造成影响的数据库初始化参数。
在sqlplus中查看初始化参数:show parameter db_block_size;或者select name, value from v$parameter where name like 'db_%';
修改初始化参数:alter system set db_block_size=8000; 有些参数修改后可以立即起作用,有的需要重启实例才能起作用。
cursor_sharing: 告诉oracle在什么情况下可以共享游标,即sql重用。三个值可以设置:exact,similar和force。
3. 初始化参数db_file_multiblock_read_count:Oracle在执行全表扫描时每次IO操作可以读取的数据块的数量。加大它通常可以加快全表扫描的执行,但是大于32的设置通常不会带来更大的性能提升。这个参数的设置受到OS最大IO能力的影响。有如下的关系:Max(db_file_multiblock_read_count)=MaxOsIOsize/db_block_size;