- 浏览: 29260 次
- 性别:
- 来自: 合肥
最新评论
一.性能视图
性能视图是Oracle中一些记录数据库性能方面的视图,通过查看这些视图,获得数据库当前或历史上某个时间的性能数据。 它比SQL_TRACE,AWR报告获取数据更及时,便捷。
Oracle 动态性能视图
1.1 V$SQL
V$SQL 视图是一个DBA 使用频率非常高的动态视图,它通常和V$SESSION 一起使用来获得当前会话的一些SQL执行情况。可以通过该视图查看正在执行的SQL语句及这条SQL运行了多长时间或者它正在等待什么样的事件。
1.1.1 用V$SQL 查看SQL 内容
为了获取用户连接到数据库中的信息,需要先从V$SESSION视图确定用户的SID号,然后用v$session 和 v$sql查看相关信息。
SQL>select * from v$session;
从这里确定根据machine列和program列确定SID。
根据SID 确定SQL:
/* Formatted on 2010/9/6 11:08:21 (QP5 v5.115.810.9015) */
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 = 23
也可以根据进程号来查看。具体参考Blog:
oracle 实时查询最耗CPU资源的SQL语句
1> 先通过top命令查看产用资源较多的spid号
2>查询当前耗时的会话ID,用户名,sqlID等:
select sid,serial#,machine,username,program,sql_hash_value,sql_id,
to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session
where paddr in (select addr from v$process where spid in ('5648612','256523'));
3> 如果上一步sql_id或者 hash_value不为空,则可用v$sqlarea查出当前正在使用的sql
select sql_text
from v$sqltext_with_newlines
where hash_value = &hash_value
order by piece;
select * from v$sql where sql_id=''
---CSDN 网友提供的----
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC
1.1.2 用V$SQL 查看SQL执行和等待时间
对于已经执行完毕的会话,可以在V$SQL视图中找到它的执行时间和消耗的CPU时间,这些信息对我们分析一些性能上存在问题的SQL有用处。比如对比SQL 消耗的CPU 和执行时间,就可以大致知道SQL语句执行中是否有长时间的等待事件:
/* Formatted on 2010/9/6 13:05:05 (QP5 v5.115.810.9015) */
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 sf select%'
SQL_TEXT T_CPU T_ELAP PCT
------------------------------ ---------- ---------- ----------
insert into sf select * from u .312002 0 .000056249
insert into sf select * from u .296402 0 .000062524
返回如上结果,如果说T_ELAP 时间比较多,而CPU时间比较少,说明这条语句在执行过程中基本处于等待状态。 关于各个等待事件,参考Blog:
Oracle 常见的33个等待事件
1.1.3 共享池中的SQL
并不是所有的SQL语句都可以从V$SQL中找到,因为ORACLE会动态地更新共享池的信息,将一些过旧的SQL从共享池中删除,以便于新的SQL语句提供共享池的空间。
我们可以手动的清空共享池中的信息,SQL语句如下:
SQL>alter system flush shared_pool;
我们知道,SQL的解析的过程中,会把硬解析之后的SQL放在放在共享池中,如果我们清空了共享池,那么就需要重新做硬分析。
Oracle SQL的硬解析和软解析
关于这点的验证,可以参考如下方法:
(1) 开启SQL_TRACE
(2) 做一条事务
(3) 清空缓冲区
(4) 在做同样的事务
(5) 关闭SQL_TRACE
(6) 用tkprof 查看trace文件,生成文件时加上aggregate=no参数,这样如果是一条SQL执行多次,在tkprof的trace文件中会分别列出来。 这个参数默认是YES。
Oracle SQL Trace 和 10046 事件
http://blog.csdn.net/tianlesoftware/archive/2010/09/02/5857023.aspx
1.2 V$SQL_SHARED_CURSOR
官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3058.htm#REFRN30254
这个视图存放了SQL在执行过程中游标共享的信息,它能帮助我们分析看起来一样的SQL,为什么没有共享的原因。
SQL> show parameter cursor_sharing;
NAME TYPE VALUE
------------------------------------ ----------- ------
cursor_sharing string EXACT
查看SQL:
SQL> select parsing_user_id puid,parsing_schema_id psid,sql_text,sql_id,child_address from v$sql where sql_text like 'insert into t%';
PUID PSID SQL_TEXT SQL_ID CHILD_AD
---------- ---------- ------------------------------ ------------- --------
0 0 insert into tabpart$ (obj#, da 9hp6m1g7j275b A21042D8
0 0 insert into tab$(obj#,ts#,file asnhcg241fr2y A877959C
--- 如果这里有多条SQL_TEXT,SQL_ID相同的,就说明SQL没有重用。 我们可以用如下SQL来确定是哪里不一致造成:
查看不能重用原因:
SQL> select * from v$sql_shared_cursor where sql_id='asnhcg241fr2y';
SQL_ID ADDRESS CHILD_AD CHILD_NUMBER U S O O S L F E B P I S T A B D L T B I I R L I O E M U T N F A I T D L D B P C S C P T M B M R O P M F L P L A F L R L H P B
------------- -------- -------- ------------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
asnhcg241fr2y A8779678 A877959C 0 N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N
如果这里有Y,就是导致不能重用的原因, 这些字母和V$SQL_SHARED_CURSOR 每个字段对应。
1.3 V$SESSION
官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3016.htm#REFRN30223
我们可以从该视图查看用户会话的信息。可以使用machine或者module找到我们的用户。Macine 是客户端机器的名称,userName是会话连接时提供的用户名,Program是客户端执行程序的名称,module是Oracle 的存储过程DBMS_ALLPLCATION_INFO.SET_MODULE给出的执行程序的名称。
这种直接查询v$session视图的方法只适合哪种两层结构的C-S架构,这种是客户端直接连接到数据库。 但是现在基本都是三层架构。 通过中间件如weblogic来连接数据库。 这种情况下就需要在中间件服务上进行跟踪,比如获得用户道和中间件的连接信息,然后根据中间件的信息或者日志来确定用户的最终信息。
V$SESSION 常用来查看用户当前的状态,当前执行的SQL语句,SQL语句执行时间,以及等待事件等。
V$SESSION 里面有个字段last_call_et(单位:秒),表示执行时间,这里有两种状态:
1. Session 处于active 状态,该字段表示session变成active到现在的时间;
2. Session处于inactive状态, 此时表示session 变成inactive到现在的时间。
示例1:查询active的session:
SQL> select status,last_call_et,event from v$session where sid=23;
STATUS LAST_CALL_ET EVENT
-------- ------------ --------------------------------------------
INACTIVE 9976 SQL*Net message from client
这里的9976 表示的从session变成inactive到现在的秒数。
示例2:查询inactive的session:
/* Formatted on 2010/9/6 16:52:32 (QP5 v5.115.810.9015) */
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 = '279';
注意:
在RAC 状态下,会话需要来自不同的实例,所以在RAC 环境下需要使用GV$SESSION视图, 因为这个视图含有INST_ID 字段,通过这个字段可以区别实例。
1.4 V$SESSTAT
官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3027.htm#REFRN30232
这个视图记录了某个session从运行以来各种资源统计数据,通过关联表v$statname 可以查询出某个session的资源消耗情况,如:
/* Formatted on 2010/9/6 17:06:56 (QP5 v5.115.810.9015) */
SELECT a.sid, b.name, a.VALUE
FROM v$sesstat a, v$statname b
WHERE a.sid = 23 AND a.statistic# = b.statistic#
AND b.name IN
('consistent gets',
'physical reads',
'parse count (total)',
'parse count (hard)');
SID NAME VALUE
---------- -------------------- ----------
23 consistent gets 29750
23 physical reads 386
23 parse count (total) 387
23 parse count (hard) 82
这里显示了SID=23的session的信息。
1.5 V$SESSION_WAIT
官网链接地址:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3023.htm#REFRN30229
V$SESSION_WAIT 记录了会话的一些等待信息,这些等待信息在v$session视图里可以可以查到。
示例:
/* Formatted on 2010/9/6 17:19:40 (QP5 v5.115.810.9015) */
SELECT event,
p1,
p1text,
p2,
p2text,
p3,
p3text,
wait_time,
seconds_in_wait,
state
FROM v$session_wait
WHERE sid = 23;
关于等待事件参考Blog:
Oracle 常见的33个等待事件
http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
二. 性能参数
性能参数指它的设置会影响数据库性能问题的初始化参数。 这些参数比较多,具体参考ORACLE 官网文档。
2.1 CURSOR_SHARING
该参数决定在什么情况下可以使用共享游标,即SQL重用。它有三个值: EXACT, SIMILAR 和FORCE.
默认情况下,oracle 将该参数值是EXACT. 意思是SQL必须绝对一样才能共享游标,否则将作为新的SQL语句处理。
这种设置的意义在于,从Oracle层面来看,通过精确地匹配每个SQL语句,就可以保证只有语句完全相同的SQL,才可以在共享池中被重用,否则将作为新的SQL语句对待。 而把构造完全一样的SQL语句的任务留给用应用来完成,即由应用来通过变量绑定的方式达到SQL重用,而不是依赖ORACLE来实现,这样的好处是可以大大减少ORACLE花费在SQL分析上的资源消耗(cursor_sharing=similar),及避免Oracle不加判断地绑定变量导致执行计划选择的错误(cursor_sharing=force).
2.1.1 cursor_sharing=exact(默认值)
这种情况下,只有SQL完全一样的,才会在共享池中重用SQL,我们可以使用绑定变量来实现SQL一样。但是在OLTP系统中,如果绑定变量的效果不太好,将CURSOR_SHARING设置为exact 就会增加Oracle 对SQL 的硬分析量,消耗更多的系统资源。 如果出现这种情况,cursor_sharing 就需要设置为其他的两个值。
2.1.2 cursor_sharing=similar
SQL> alter session set cursor_sharing=similar;
会话已更改。
SQL> select * from all_objects set_similar where object_id=10;
SQL> select * from all_objects set_similar where object_id=20;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
SQL_TEXT
------------------------------------------------------------------------------
select * from all_objects set_similar where object_id=:"SYS_B_0"
select * from all_objects set_similar where object_id=:"SYS_B_0"
如果你测试的结果不一样,把共享池清空一下就可以了:
SQL> alter system flush shared_pool;
从这个结果看,当设置cursor_sharing=similar 时,Oracle会将SQL语句中的谓词条件用同一个名称的一个变量替代:SYS_B_0, 如果谓词中还有其他变量,将一次使用SYS_B_1,SYS_B_2. 这两条语句看起来一样,但是,Oracle 依然会把它们作为2条SQL语句来处理。
2.1.3 cursor_sharing=force
SQL> alter session set cursor_sharing=force;
SQL> select * from all_objects set_similar where object_id =2;
SQL> select * from all_objects set_similar where object_id =1;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
SQL_TEXT
--------------------------------------------------------------------------
select * from all_objects set_similar where object_id =:"SYS_B_0"
如果你测试的结果不一样,把共享池清空一下就可以了:
SQL> alter system flush shared_pool;
从上面的结果看,当设置cursor_sharing=force时,Oracle 会把这两条SQL语句的谓词用变量SYS_B_0代替,并且将它们看做同一条SQL语句来处理。
在OLTP系统才能使用绑定变量带来性能上的提升,因为在这样的系统中,SQL执行计划基本上是相同的,不会因为谓词的条件而改变。
而在OLAP系统中,因为OLAP系统中数据的变化非常大,列上的数据分布也可能很不均匀,这时候使用绑定变量,可能会出现问题。
按照Oracle 官方的说法,将参数值设置为EXACT是最优的。但是它的前提是需要通过应用程序绑定变量来达到最优的SQL重用。 只有高效的变量绑定,EXACT值才是最优的。而Similar和Force 是在系统没有使用绑定变量时,为了降低系统大量的SQL解析而使用的补救方法,但是它有很多问题,如不加区别或者略加区别的对谓词强制绑定变量,导致SQL的执行计划错误。
SIMILAR 和Force 的区别:
Similar:如果CBO 发现被绑定变量的谓词还有其他执行计划可以选择,如果谓词条件的值有变化,就将会产生一个新的子游标,而不是重用之前的SQL语句;如果谓词没有其他的执行计划可选择,则忽略谓词的值,重用之前的SQL语句。
Force: CBO和SQL 语句的所有谓词用变量替换,只做一次硬解析,之后所有的SQL都重用第一个SQL语句。
2.2 DB_FILE_MULTIBLOCK_READ_COUNT
Oracle 在做一次连续的数据库扫描时,一次I/O 允许读取的最大数据块数,但有一个限制,就是每次I/O的大小不能超过Oracle 运行的操作系统的最大I/O值(通常是1M)。
假设一张表有10240KB大小,数据块的大小为8kb,设置DB_FILE_MULTIBLOCK_READ_COUNT=32,那么我们对这张表做全表扫描的次数为: 10240/(32*8)=40次,即Oracle 对这张表做扫描需要花费40次I/O。 但是实际上,Oracle 花费的I/O次数可能大于这个值,可可能小于这个值。 因为Oracle在读多个数据库时,当内存中已经有了某个数据块时,Oracle 就不再从磁盘中读取它。
对于OLTP数据库来说,每次用户读取的记录数非常少,这个值可以考虑设置的小一点;对于OLAP系统,因为查询的量非常大,所以可以考虑设置大一些。
注意: 多数据块读取操作只发生在一下两种情况:
(1) FTS(FULL TABLE SCAN)
(2) INDEX_FFS(INDEX FAST FULL SCAN)
关于这两种连接方式,参考Blog:
Oracle 索引扫描的四种类型
(1) 索引唯一扫描(index unique scan)
(2) 索引范围扫描(index range scan)
(3) 索引全扫描(index full scan)
(4) 索引快速扫描(index fast full scan)
这个参数才10g R2版本后,Oracle不建议修改它的默认值。 当设置这个值为默认值时,Oracle 会通过收集SQL的I/O 情况,来动态设置这个参数的值,如果手工修改了它的默认值,Oracle 将确定使用这个新值。
这个参数影响到CBO对成本的评估,通常来说,这个值设置的越大,FFS或者INDEX_FFS 得成本就会越低,执行计划就越向这面倾斜。
本文转载自http://blog.csdn.net/sopost/article/details/6173118 谢谢
发表评论
-
ora-00054错误解决方案
2011-08-05 12:23 1425视图名 描述 主要字段说明 v$sessi ... -
oracle 查找比较慢的sql和session
2011-08-05 12:14 6825一、如何找到消耗资源大的Oracle的session及其执行的 ... -
oracle sql优化学习笔记
2011-07-19 14:17 865select 语句中避免使用'*',这种方法非常低效,在or ... -
oracle 分析函数,实现行转列的实例
2010-09-10 11:13 0--oracle 分析函数,实现行--》列的实例Create ... -
oracle sum over 函数的使用
2010-09-08 10:40 0oracle sum over 函数的使用 有累计字段时,需 ... -
oracle optimizer_mode 优化模式
2010-08-30 21:20 1195Oracle 优化参数 optimizer_mode 介绍 ...
相关推荐
在Oracle数据库管理与优化领域,深入了解和利用Oracle性能视图(V$视图)至关重要。随着Oracle版本的不断升级,V$视图的数量也在不断增加,从Oracle 6时代的23个到10g R2的372个,这反映了Oracle数据库复杂性的增长...
这种做法是Oracle性能监控工具如Statspack和ASH(Active Session History)所常用的方法。通过对比不同时间区间的数据,可以观察到用户数量增长或数据增加对系统资源使用的影响。 在V$SYSSTAT视图中,包含多个统计...
本文将详细介绍Oracle10g DBA常用的几个数据字典视图和动态性能视图,帮助读者更好地理解和利用这些资源。 #### 一、DBA最常用的数据字典 数据字典是存储在SYSTEM表空间中的一系列特殊表,它们提供了关于数据库...
DBA可以利用Oracle提供的多种工具和视图,如动态性能视图(V$视图)和自动工作负载存储库(AWR报告)等,来获取数据库性能数据和诊断信息。 为了持续优化Oracle数据库性能,DBA还需要定期审查数据库对象,比如索引...
- 对于大多数`V$`视图,都有一个对应的`GV$`视图版本,除了少数几个例外(如`V$CACHE_LOCK`、`V$LOCK_ACTIVITY`、`V$LOCKS_WITH_COLLISIONS`和`V$ROLLNAME`)。 **特点:** - `GV$`视图从集群中的所有实例收集信息...
总结而言,在进行Oracle性能优化时,对SGA的各组成部分进行细致的调优是非常关键的。通过对共享池和数据缓冲区的深入分析及调整,可以显著提升数据库的响应速度和吞吐量。此外,定期监控实例的等待状况以及SQL执行...
本文以Unix平台上的Oracle 8为例,详细讲解了几个主要的动态参数视图的使用方法。 首先,获取数据库的基本信息是了解数据库的第一步。在Svrmgr中,通过查询V$INSTANCE和V$DATABASE视图,可以得知实例名称、版本号、...
首先,我们来看几个关键的Oracle性能相关参数: 1. MAX_DSPATCHERS:这个参数设定系统允许的并发调度进程最大数量,用于管理客户端请求的并发处理能力。 2. MAX_SHARED_SERVERS:此参数用于设定系统中可同时运行的...
通过本教程的学习,我们不仅掌握了物化视图和查询重写的基本原理及其在Oracle数据库中的实现方法,而且还深入了解了如何通过一系列的具体操作来优化数据仓库系统的查询性能。这些技术的应用可以显著提高大型数据仓库...
首先,Oracle性能优化主要关注以下几个方面: 1. SQL优化:SQL查询是数据库操作的核心,优化SQL语句能显著提升系统性能。这包括避免全表扫描、使用索引、减少JOIN操作、合理使用子查询和临时表等策略。通过EXPLAIN ...
Oracle性能优化是数据库管理员和开发人员关注的重要领域,旨在提高Oracle数据库系统的运行效率,减少响应时间,提升系统吞吐量,以及改善用户满意度。Oracle SQL性能调优是这个过程的关键部分,因为它涉及到优化SQL...
对于DBA来说,掌握Oracle性能优化是一个不断学习和实践的过程,需要对Oracle数据库系统有深入的理解,并且能够根据实际情况灵活调整策略。而文章中提供的“Oracle性能优化求生指南”无疑是一个很好的学习资源,尤其...
在Oracle性能优化过程中,主要涉及以下几个方面:磁盘I/O优化、内存优化、CPU优化以及查询优化等。通过这些方面的综合调整与优化,可以显著提升Oracle数据库的运行效率。 #### 二、索引优化 索引是提高查询速度的...
本文旨在深入探讨Oracle数据库性能优化的最佳实践,包括数据库性能基础、调优方法论、SQL语句调优以及Oracle性能优化解决方案,帮助数据库管理员(DBA)和开发者提升数据库系统的整体效能。 ### 数据库性能基础及调优...
Oracle性能调优是一个复杂而关键的过程,涉及到数据库的多个层面,包括应用程序、数据库结构、操作系统、I/O系统以及网络等。以下是对Oracle性能优化的基本方法的详细解释: 1. 设立合理的性能优化目标:目标应该...
Oracle Database 11gR2性能调整主要涉及以下几个方面: 1. **SQL优化**:SQL查询是数据库性能的关键,通过分析、重构和使用索引、绑定变量等方法可以提升查询效率。 2. **存储优化**:包括物理表结构设计、分区策略...
首先,文章提到了几个直接影响性能的可变参数。DB_BLOCK_BUFFERS参数指定了数据库高速缓存区的数量,影响了内存中的数据块存储,从而影响I/O性能。DB_BLOCK_SIZE参数设定数据块的大小,它不仅决定SGA(System Global...
本文将详细讲解Oracle中的几个关键概念:视图、索引、同义词和序列,以及它们在查询优化和数据管理中的作用。 首先,我们来谈谈索引。索引是一种特殊的数据库结构,它能够显著提升查询速度。Oracle支持多种类型的...
Oracle数据库的优化主要涉及以下几个核心方面: 1. **索引优化**:索引是提升查询速度的关键。书中会讲解如何选择合适的索引类型(如B树索引、位图索引、函数索引等),以及何时创建和使用索引,如何避免索引失效和...
优化SQL性能可以从以下几个方面着手: 1. **索引优化**:索引是提高查询效率的重要手段,合理的索引设计可以显著减少数据查找的时间。需要考虑单列索引、复合索引、函数索引、唯一索引和非唯一索引的适用场景,同时...