`

oracle中v$sql和v$sqlarea视图介绍(转)

阅读更多

 

文章出自: http://blog.sina.com.cn/s/blog_53a1165e0100nisg.html

 

v$sqlv$sqlarea视图:

v$sqlareav$sql两个视图的不同之处在于,v$sql中为每一条SQL保留一个条目,而v$sqlarea中根据sql_text进行group by,通过version_count计算子指针的个数。下面对这个问题进行一点延伸探讨。

首先介绍一下v$sql视图,v$sql视图列举了共享SQL区(Shared SQL Area)中的SQL统计信息,这个视图中的信息未经分组,每个SQL指针都包含一条独立的记录。这个视图的主要字段如下:

 

Column

Datatype

Descrption

SQL_TEXT

VARCHAR2(1000)

当前SQL指针的前1000个字符(也就是说这里记录的SQL是不完整的)

EXECUTIONS

NUMBER

执行次数

DISK_READS

NUMBER

这个子指针Disk Read的次数

BUFFER_GETS

NUMBER

这个子指针的Buffer Gets数量

OPTIMIZER_MODE

VARCHAR2(10)

SQL执行的优化器模式

OPTIMIZER_COST

NUMBER

SQL执行成本

HASH_VALUE

NUMBER

Library Cache中父指针的Hash Value

 

用前文应用的例子进行进一步说明,假定数据库中存在一个用户TQ,用户下存在一张EMP表(以下测试来自Oracle 10gR2数据库环境):

tq@NEI> create table emp as select * from scott.emp;
Table created.
tq@NEI> set autotrace on
tq@NEI> select count(*) from emp;
  COUNT(*)
----------
        14
Execution Plan
----------------------------------------------------------
Plan hash value: 2083865914
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement
Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         
7  consistent gets
         
5  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

这个查询的统计信息显示,执行了5个物理读7Consistent Gets,来看一下v$sql中记录的统计数据:

sys@NEI> select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value
  2  from v$sql where sql_text='select count(*) from emp';
SQL_TEXT                       EXECUTIONS DISK_READS OPTIMIZER_ BUFFER_GETS HASH_VALUE
------------------------------ ---------- ---------- ---------- ----------- ----------
select count(*) from emp                1          5 ALL_ROWS             7 2295140356

记录的信息和AUTOTRACE显示的信息完全一致。在第一次执行时,这个SQLHASH_VALUE被计算出来为2295140356,并且随之,这个SQL的父指针(Parent Cursor)在内存中被创建,一个子指针同时创建父指针可以被认为是Hash Value的相关信息,子指针可以被认为是SQL的元数据

 

再次执行这个查询,统计信息中的物理读(DISK_READS)不再增加,因为数据已经在Buffer中存在,而BUFFER_GETS继续增加。执行次数也变为2

tq@NEI> select count(*) from emp;
  COUNT(*)
----------
        14
Execution Plan
----------------------------------------------------------
Plan hash value: 2083865914
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


sys@NEI> select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value
  2  from v$sql where sql_text='select count(*) from emp';  

                   
SQL_TEXT                       EXECUTIONS DISK_READS OPTIMIZER_ BUFFER_GETS HASH_VALUE
------------------------------ ---------- ---------- ---------- ----------- ----------
select count(*) from emp                2          5 ALL_ROWS            10 2295140356

 

v$sqlarea视图也是非常重要的一个视图,在Oracle 9iR2的文档中,Oracle这样定义这个视图:v$sqlarea列出了共享SQL区(Shared SQL Area)中的SQL统计信息,这些SQL按照SQL文本的不同,每条会记录一行统计数据注意这里所说的是按照SQL文本来进行区分,也就是说这个视图的信息可以看作是根据SQL_TEXT进行的一次汇总统计

 

v$sqlarea视图的主要字段如下:

Column

Datatype

Description

SQL_TEXT

VARCHAR2(1000)

当前指针的前1000个字符

VERSION_COUNT

NUMBER

Cache中这个父指针下存在的子指针的数量

EXECUTIONS

NUMBER

总的执行次数,包含所有子指针执行次数的汇总

DISK_READS

NUMBER

所有子指针的Disk Reads总和

BUFFER_GETS

NUMBER

所有子指针的Buffer Gets总和

OPTIMIZER_MODE

VARCHAR2(10)

SQL执行的优化器模

HASH_VALUE

NUMBER

父指针的Hash Value

 

通过前文可以知道,文本相同的SQL语句,在数据库中的意义可能完全不同。比如数据库中存在两个用户TQDBTAN,两个用户各拥有一张数据表EMP

那么当两个用户发出一个查询select count(*) from emp时,这个查询访问的对象,返回的结果可能完全不同,TQ的查询访问的是TQ.EMP表,而DBTAN用户访问的则是DBTAN.EMP表。但是单从SQL_TEXT上来说,这两个SQL没有任何区别。

继续前面的测试,再来简单看一下以下的输出:

dbtan@NEI> create table emp as select * from scott.emp where rownum <9;
Table created.
dbtan@NEI> set autotrace on
dbtan@NEI> select count(*) from emp;
  COUNT(*)
----------
         8
Execution Plan
----------------------------------------------------------
Plan hash value: 2083865914
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| EMP  |     8 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement
Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
          7  consistent gets
          5  physical reads
          0  redo size
        411  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

现在v$sql中应该有了两条完全一样的SQL,但是各自查询的物理对象却是截然不同:

sys@NEI> select sql_text,executions,disk_reads,optimizer_mode,buffer_gets,hash_value
  2  from v$sql where sql_text='select count(*) from emp';
SQL_TEXT                       EXECUTIONS DISK_READS OPTIMIZER_ BUFFER_GETS HASH_VALUE
------------------------------ ---------- ---------- ---------- ----------- ----------
select count(*) from emp                3          5 ALL_ROWS            13 2295140356
select count(*) from emp                1          5 ALL_ROWS             7 2295140356

现在再来查询v$sqlarea视图,就可以看到这两个视图的不同:

sys@NEI> select sql_text,executions,disk_reads,buffer_gets,hash_value,version_count
  2  from v$sqlarea where sql_text='select count(*) from emp';
SQL_TEXT                       EXECUTIONS DISK_READS BUFFER_GETS HASH_VALUE VERSION_COUNT
------------------------------ ---------- ---------- ----------- ---------- -------------
select count(*) from emp                4         10          20 2295140356             2

在这个视图中,Oraclev$sql中的sql_text相同的2个子指针合并起来,执行次数等信息也都进行了累计,version_count也显示为2,这就是v$sqlarea的聚合作用。

 

 

分享到:
评论

相关推荐

    Oracle v$sqlarea, v$sql, v$sqltext视图说明

    简单描述Oracle v$sqlarea, v$sql, v$sqltext视图说明

    oracle_V$SQLAREA_.rar_oracle_oracle V$sqlarea

    标题中的"oracle_V$SQLAREA_.rar_oracle_oracle V$sqlarea"暗示了这是一个关于`V$SQLAREA`视图的资源压缩包,可能包含了相关查询和解释的文本文件。 `V$SQLAREA`视图包含的数据涵盖了SQL语句的多个方面,如: 1. *...

    Oracle的V$性能视图学习大全

    此外,V$视图家族中的V$SQLAREA、V$SQLTEXT、V$SESSION和V$SESS_IO等视图,可以用来查询和分析SQL语句的执行状态和性能。通过这些视图,DBA可以识别出执行时间长、占用资源多的SQL查询,进而对查询语句进行优化。 ...

    oracle 动态性能(V$)视图

    1. **执行计划分析**:如V$SQL、V$SQLAREA和V$SQLTEXT,这些视图存储了SQL语句的相关信息,包括执行计划、统计信息和绑定变量等,对SQL性能分析至关重要。 2. **资源使用情况**:V$SESSION、V$SESSION_WAIT和V$...

    v$sqlarea top sql 查询举例

    根据提供的文件信息,本文将详细解释如何通过 `v$sqlarea` 视图查询实例中的 Top SQL,以便快速定位性能瓶颈或资源消耗高的 SQL 语句。以下内容将深入解析每种查询方法及其背后的原理。 ### 知识点一:通过 Buffer ...

    定位Oracle中的TOP_SQL

    可以通过 V$SQLAREA 视图来找到占用资源最多的 SQL。该视图提供了 SQL 语句的执行统计信息,可以根据 buffer_gets 和 disk_reads 字段来排序,找出占用资源最多的 SQL。 ### 方法二:通过 V$SQLSTATS 视图 在 10.2...

    oracle 查看当前会话执行的sql语句

    select SQL_TEXT from v$sqlarea where address = (select sql_address from v$session where sid = ***); ``` 这里的`***`代表要查询的SID值。 #### 6. 监控SQL执行情况 对于更高级的监控需求,我们还可以查看...

    用Oracle动态性能视图采集查询调优数

    V$SQLAREA视图与V$SQL类似,但主要关注实际输入的SQL字符串,而不包括其子语句。这意味着它通常包含更少的行,但每行信息更集中,适用于关注单个SQL语句性能的情况。 V$SQLSTATS是Oracle 10g Release 2引入的新视图...

    Oracle性能视图学习大全

    5. **分析SQL执行效率**:通过查询`V$SQLAREA`、`V$SQLTEXT`等视图,可以定位执行效率低下的SQL语句,并对其进行优化。同时,结合`V$SESSION`和`V$SESS_IO`视图,可以进一步分析特定会话的资源消耗情况。 6. **识别...

    oracle监听执行sql语句

    这条SQL语句通过连接`v$session`和`v$sqlarea`两个视图来获取当前会话中执行的SQL语句及其完整文本。其中`v$session`包含了所有活动会话的信息,而`v$sqlarea`则存储了最近执行过的SQL语句的元数据。通过`a.sql_...

    Oracle动态性能视图

    - **V$SQLAREA**、**V$SQLTEXT**、**V$SESSION** 和 **V$SESS_IO**:用于查找可能存在问题的查询。 5. **用户活动** - **V$SESSION**:检查用户的当前操作及其使用的资源。 - **V$SESSION_WAIT**、**V$SESSION_...

    oracle消耗资源的sql查询语句记录

    V$SQLAREA视图提供了关于SQL语句执行计划的信息,包括磁盘读取次数、执行次数等重要指标。下面两个查询语句展示了如何利用该视图来找出消耗资源较多的SQL语句: - **查询磁盘读取次数较高的SQL语句:** ```sql ...

    oracle中得到一条SQL语句的执行时间的两种方式

    在Oracle数据库中,获取SQL语句的执行时间是数据库管理员和开发人员进行性能优化的关键步骤。下面我们将详细探讨两种在Oracle中获取SQL语句执行时间的方法。 方法一:使用SQL*Plus的`SET TIMING ON`命令 在SQL*...

    v$sql_plan[总结].pdf

    如果之前的计划仍然在(例如,从 V$SQL_PLAN 选择出记录并保存到 oracle 表中供参考),那么就有可能去鉴别一条 SQL 语句在执行计划改变后性能方面有什么变化。 v$sql_plan视图中的常用列包括: 1. ADDRESS:当前 ...

    常用oracle动态性能视图

    - 通过 SQL 相关列(如 SQL_HASH_VALUE 和 SQL_ADDRESS),可以与 V$SQLTEXT、V$SQLAREA 和 V$SQL 视图联接,查看具体执行的 SQL 语句内容。 4. **示例查询:** - 查询当前会话信息:`SELECT SID, OSUSER, ...

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle中,可以使用`v$sqlarea`视图来获取这些信息。以下是一个示例查询: ```sql SELECT sa.SQL_TEXT, sa.SQL_FULLTEXT, sa.EXECUTIONS "执行次数", ROUND(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",...

    查找运行系统里bad sql

    查找 Bad SQL 需要了解 Oracle 系统的内部机制,熟悉 V$SQLAREA、V$SESSTAT、V$STATNAME、V$OPEN_CURSOR 等视图的使用。同时,需要了解 Bad SQL 的特点和影响,才能更好地查找和优化这些 SQL 语句。

    Oracle10g DBA经常使用的动态性能视图和数据字典

    - **v$sqlarea**:提供了共享池中使用当前光标的统计信息,这有助于监控SQL语句的执行情况。 - **v$statname**:报告了在v$sesstat中各个统计的含义,这对于理解统计信息的具体意义非常重要。 - **v$sysstat**:提供...

Global site tag (gtag.js) - Google Analytics