系列相关
ORACLE常用性能监控SQL【一】
ORACLE常用性能监控SQL【二】
Oracle-动态性能视图解读
动态性能视图概述
动态性能视图属于数据字典,它们的所有者为SYS,并且多数动态性能视图只能由特权用户和DBA用户查询。
当数据库处于不同状态时,可以访问的动态性能视图有所不同。
启动例程时,ORACLE会自动建立动态性能视图;停止例程时,ORACLE会自动删除动态性能视图。
数据字典信息是从数据文件中获得,而动态性能视图信息是从SGA和控制文件取得。
所以,两者所反映的信息还是有很大差异的。数据库管理员利用这些动态性能视图,可以了解数据库运行的一些基本信息,为我们进行数据库维护以及数据库性能优化提供一些数据上的支持。
动态性能视图在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关。
虽然这些视图很像普通的数据库表,但它们不允许用户直接进行修改。
这些视图提供内部磁盘结构和内存结构方面的数据。用户可以对这些视图进行查询,以便对系统进行管理与优化。
所有动态性能视图都是以V_ 开始的,ORACLE为每个动态性能视图提供了相应的同义词(V 开头). V 是 V_ 的同义词。
通过查询
V$FIXED_TABLE
,可以显示所有动态性能视图.
数据库不同的状态下的动态性能视图
一般情况下,我们可以通过动态性能数据掌握两类重要的数据库运行信息。
- 了解数据库运行相关的性能数据,如内存的使用量、磁盘排序发 生的机率等等。
- 取得与磁盘和内存结构相关的其他信息。
在通常情况下, 数据库不同的状态其动态性能视图还是有比较大的差异:
NOMOUNT
启动例程时,ORACLE会打开参数文件,分配SGA并启动后台进程。因此例程处于NOMOUNT状态时,只能访问从SGA中获取信息的动态性能视图。
MOUNT
装载数据库时,ORACLE根据初始化参数control_file 打开所有控制文件。当例程处于MOUNT状态时,不仅可以访问从SGA中获取信息的动态性能视图,还可以访问从控制文件中获取信息的动态性能视图。
OPEN
数据库打开时,ORACLE按照控制文件所记载的信息打开所有数据文件和重做日志。除了可以访问SGA和控制文件中获取信息的动态性能视图外,还可以访问与ORACLE性能相关的动态性能视图(V FILESTAT V SESSION_WAIT V
注意的是,只有处于OPEN状态时,才能访问数据字典视图。
V$, V_$, GV$, X$
X$ 表
X$
表包含了特定实例的各方面的信息, 是 Oracle 数据库的运行基础, 如当前的配置信息,连接到实例的会话,以及丰富而有价值的性能信息。
X 表并不是驻留在数据库文件的永久表或临时表。 X 表仅仅驻留在内存中,当实例启动时, 由 Oracle 应用程序动态创建,在内存中进行实时的维护。
它们中的大多数至少需要装载或已经打开的数据库。
X$
表为 SYS 用户所拥有,并且是只读的。 不能进行 DML(更新,插入,删除)。 表对数据库来说至关重要,所以 Oracle 不允许 SYSDBA 之外的用户直接访问, 显示授权不被允许。
关于 X 表,其创建信息我们也可以通过 bootstrap 表查看,该表中记录了数据库启动的基本及驱动信息。
bootstrap 实际上存储的是数据字典的基表的定义,如 OBJ ,C_OBJ ,TAB 等等。
Oracle 通过读取这些定义创建数据字典的基表,进而创建数据字典。
查询必须是sys用户,dba权限的用户没有权限查询。
GV$
和
V$
同义词
V$
视图
动态性能视图由前缀 V_ 标识。这些视图的公用同义词具有前缀 V 。数据 库管理员或用户应该只访问 V 对象,而不是访问 V_ 对象。
一旦实例启动,从内存读取数据的 V$视图就可以访问了。
注意: 每个
V$
视图都包含类似语句:
用于限制返回当前实例信息。
这一点我们可以通过
V$FIXED_VIEW_DEFINITION
视图 来验证
必须使用sys用户查询。
通过 v fixed_table 查询 V 视图信息:
DBA用户即可。
GV$
视图
从 Oracle8 开始, GV 视图开始被引入, GV ( Global V ,全局 V )。
除了一 些 特 例 以 外 (如 : V CACHE_LOCK 、 V LOCK_ACTIVITY 、 V LOCKS_WITH_COLLISIONS 和 V ROLLNAME),每个 V 视图都有一个对应的 GV 视图存在。
在并行服务器环境下,可查询 GV 视图从所有限定实例中检索 V 视图的信息
V 视图和 GV 视图是相同的, V 比 GV 只是少了 INST_ID字段。
举个栗子 v parameter 和 gv parameter
INST_ID 列显示从其获得相关的 V 视图信息的实例号。 INST_ID 列可用 作一个从可得到的实例集检索 V 信息的过滤器。
如:
表示从实例 1 上的
V$
视图中检索信息。
通过 v fixed_table 查询 GV 视图信息
从查询结果看, GV 是 523个, V 是 552个,从这个结果可以证明:不是每个V 同义词都有对应的 GV 同义词。
V$FIXED_VIEW_DEFINITION
视图
通过 V FIXED_VIEW_DEFINITION 视图可以获取组成 V 视图的底层 X
比如查看
V$FIXED_TABLE
视图定义
从这里, 我们看到 V FIXED_TABLE 基于 GV FIXED_TABLE 创建。
查看
GV$FIXED_TABLE
定义
从这里, 我们找到了 GV FIXED_TABLE 视图的创建语句,该视图基于 X 表创建。
GV_$, V_$
视图
动态性能的视图是通过 catalog.sql 创建。当 catalog.sql 运行时:
我们注意到, 先创建 V_ 和 GV_ 视图, 然后基于 V_ 视图和 GV_ 视图来创建 V 和 GV 同义词。
所以,实际上通常我们访问的 V 视图,其实是指向 V_ 视图的同义词。 而V_ 视图是基于 X 表建立的。 关于这一点可以通过:v
动态性能对象那么多,如何来判断某个对象到底是同义词还是视图呢? 可以通 过如下 SQL 来实现:
常用动态性能视图
维护数据库、调整数据库性能时,需要经常访问动态性能视图,以获取例程的动态信息。大多数动态性能视图只能由特权用户和DBA用户访问。
1、
V$FIXED_TABLE
该动态性能视图用于列出所有可用的动态性能视图和动态性能表。
2、
V$INSTANCE
获取当前例程的详细信息。
3、V$SGA
显示SGA主要组成部分
4、
V$SGAINFO
取得SGA的更详细信息
5、
V$PARAMETER
取得初始化参数的详细信息
6.
V$VERSION
获取ORACLE版本的详细信息
7.
V$OPTION
显示已经安装的ORACLE选项
8. V$SESSION
显示会话的详细信息
如果username为NULL,则表示是后台进程会话。
9.
V$PROCESS
显示与ORACLE相关的所有进程信息(包括后台进程和服务器进程)
10.
V$BGPROCESS
显示后台进程详细信息
11.
V$DATABASE
取得当前数据库的详细信息
V$CONTROLFILE
取得当前数据库所有控制文件的信息。
13.
V$DATAFILE
取得当前数据库的所有数据文件的详细信息
14.
V$DBFILE
取得数据文件编号及名称
V$LOGFILE
显示重做日志成员的信息
16.
V$LOG
显示日志组的详细信息
17. V$THREAD
取得重做线程的详细信息,当使用RAC结构时,每个例程都对应一个重做线程,并且每个重做线程包含独立的重做日志组。
18.
V$LOCK
显示锁信息,通过与
V$SESSION
进行连接查询,可以显示占有锁的会话,以及等待锁的会话。
19.
V$LOCKED_OBJECT
显示被加锁的数据库对象。通过与DBA_OBJECTS进行连接查询,以显示具体的对象名及执行加锁操作的ORACLE用户名。
20.
V$ROLLNAME V$ROLLSTAT
V ROLLNAME显示处于ONLINE状态的UNDO段,V ROLLSTAT显示UNDO段的统计信息。通过二者执行连接查询,以显示UNDO的详细统计信息。
21. V$TABLESPACE
显示表空间信息
oracle最重要的9个动态性能视图
按组分的几组重要的性能视图
1.System 的 over view
2.某个session 的当前情况
3.SQL 的情况
4. Latch / lock /ENQUEUE(闩,锁相关)
5. IO 方面的
6.shared pool / Library cache
7.几个advice也不错
8.等待事件:
9.块竞争:
10.热块:
Oracle 性能相关的几个视图和参数
性能视图是 Oracle 中一些记录数据库性能方面的视图,通过查看这些视图, 获得数据库当前或历史上某个时间的性能数据。 它比 SQL_TRACE, AWR 报告获取数据更及时,便捷。
V$SQL
V SQL 视 图 是 一 个 DBA 使 用 频 率 非 常 高 的 动 态 视 图 , 它 通 常 和V SESSION 一起使用来获得当前会话的一些 SQL 执行情况。可以通过该视图查看正在执行的 SQL 语句及这条 SQL 运行了多长时间或者它正在等待什么样的事件。
用 V$SQL 查看 SQL 内容:
为了获取用户连接到数据库中的信息,需要先从 V SESSION 视图确定用户的 SID 号,然后用 v session 和 v
从这里确定根据 machine 列和 program 列确定 SID。
根据 SID 确定 SQL:
也可以根据进程号来查看:
用 V$SQL 查看 SQL 执行和等待时间
对于已经执行完毕的会话,可以在 V$SQL 视图中找到它的执行时间和消耗的 CPU 时间,这些信息对我们分析一些性能上存在问题的 SQL 有用处。比如对比 SQL 消耗的 CPU 和执行时间,就可以大致知道 SQL 语句执行中是否有长时间的等待事件:
如果说 T_ELAP 时间比较多,而 CPU 时间比较少,说明这条语句在执行过程中基本处于等待状态。
共享池中的 SQL
并不是所有的 SQL 语句都可以从 V$SQL 中找到,因为 ORACLE 会动态地 更新共享池的信息,将一些过旧的 SQL 从共享池中删除,以便于新的 SQL 语句提供共享池的空间
我们可以手动的清空共享池中的信息, SQL 语句如下:
我们知道, SQL 的解析的过程中,会把硬解析之后的 SQL 放在放在共享池 中,如果我们清空了共享池,那么就需要重新做硬分析。
Oracle SQL的硬解析和软解析
Oracle SQL Trace 和 10046 事件
V$SQL_SHARED_CURSOR
这个视图存放了 SQL 在执行过程中游标共享的信息, 它能帮助我们分析看起来一样的 SQL,为什么没有共享的原因。
查看 SQL:
如果这里有多条 SQL_TEXT, SQL_ID 相同的,就说明 SQL 没有重用.
用如下 SQL 来确定是哪里不一致造成.
查看不能重用原因:
如 果 这 里 有 Y , 就 是 导 致 不 能 重 用 的 原 因 , 这 些 字 母 和
V$SQL_SHARED_CURSOR
每个字段对应。
V$SESSION
我们可以从该视图查看用户会话的信息。可以使用 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(单位:秒),表示执行时间,这里有两 种状态:
- Session 处于 active 状态,该字段表示 session 变成 active 到现在的时间;
- Session 处于 inactive 状态, 此时表示 session 变成 inactive 到现在的时间。
查询 active 的 session:
查询 inactive 的 session:
注意:
在 RAC 状态下,会话需要来自不同的实例,所以在 RAC 环境下需要使用
GV$SESSION
视图, 因为这个视图含有 INST_ID 字段,通过这个字段可以区别实例。
V$SESSTAT
这个视图记录了某个 session 从运行以来各种资源统计数据,通过关联表
v$statname
可以查询出某个 session 的资源消耗情况.
查看 SID=837 的 session 的信息。
V$SESSION_WAIT
V SESSION_WAIT 记录了会话的一些等待信息,这些等待息在 v session视图里可以可以查到。
性能参数
性能参数指它的设置会影响数据库性能问题的初始化参数。 这些参数比较多,具体参考 ORACLE 官网文档。
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) .
cursor_sharing=exact(默认值)
这种情况下,只有 SQL 完全一样的,才会在共享池中重用 SQL,我们可以使用绑定变量来实现 SQL 一样。
但是在 OLTP 系统中,如果绑定变量的效果不太好,将 CURSOR_SHARING 设置为 exact 就会增加 Oracle 对 SQL 的硬分析量,消耗更多的系统资源。 如果出现这种情况, cursor_sharing 就需要设置为其他的两个值。
cursor_sharing=similar
如果你测试的结果不一样,把共享池清空一下就可以了:
从这个结果看,当设置 cursor_sharing=similar 时, Oracle 会将 SQL 语句中的谓词条件用同一个名称的一个变量替代: SYS_B_0, 如果谓词中还有其他变量,将一次使用 SYS_B_1, SYS_B_2. 这两条语句看起来一样,但是, Oracle 依然会把它们作为 2 条 SQL 语句来处理。
cursor_sharing=force
如果你测试的结果不一样,把共享池清空一下就可以了:
从上面的结果看,当设置 cursor_sharing=force 时, Oracle 会把这两条 SQL