Oracle v$SQLAREA

v$sql与v$sqlarea基本相同,记录共享sql区(share pool)中sql统计信息,如内存消耗、IO(物流磁盘读和逻辑内存读)、排序操作、哈希ID等数据。不同之处在于v$sql为每一条sql保留一个条目,而v$sqlarea中根据sql_text进行group by,统计列进行sum(),通过version_count计算子指针的个数。

         sql_text相同的sql语句在数据库中意义可能完全不同,此时,v$sql会有这两条完全一样的sql各自的统计信息,而在v$sqlarea中sql_text相同的2个指针会合并,执行次数,DISK_READS,BUFFER_GETS等统计信息会累加,这就是v$sqlarea的聚合作用

         v$sqltext中没有统计信息,却存储着完整的sql语言及其哈希ID等。

         v$session主要用来确定会话相关信息,如通过SID和SERIAL来确定一个Session、会话拥有者用户名username、会话状态、会话由哪个客户端发起、正在执行什么sql(通过sql_address、sql_hash_value、sql_id、sql_child_number确定,再借助v$sqltext就可以知道)、锁等待相关信息(如所在表、文件、块、被锁行)等。

V$SQLAREA 
  本视图持续跟踪所有shared pool中的共享cursor,在shared pool中的每一条SQL语句都对应一列。本视图在分析SQL语句资源使用方面非常重要。 

V$SQLAREA中的信息列 

HASH_VALUE:SQL语句的Hash值。 
ADDRESS:SQL语句在SGA中的地址。 
这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。 
PARSING_USER_ID:为语句解析第一条CURSOR的用户 
VERSION_COUNT:语句cursor的数量 
KEPT_VERSIONS: 
SHARABLE_MEMORY:cursor使用的共享内存总数 
PERSISTENT_MEMORY:cursor使用的常驻内存总数 
RUNTIME_MEMORY:cursor使用的运行时内存总数。 
SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。 
MODULE,ACTION:使用了DBMS_APPLICATION_INFO时session解析第一条cursor时的信息 

V$SQLAREA中的其它常用列 

SORTS: 语句的排序数 
CPU_TIME: 语句被解析和执行的CPU时间 
ELAPSED_TIME: 语句被解析和执行的共用时间 
PARSE_CALLS: 语句的解析调用(软、硬)次数 
EXECUTIONS: 语句的执行次数 
INVALIDATIONS: 语句的cursor失效次数 
LOADS: 语句载入(载出)数量 
ROWS_PROCESSED: 语句返回的列总数 

V$SQLAREA中的连接列Column View Joined Column(s) 
HASH_VALUE, ADDRESS V$SESSION SQL_HASH_VALUE, SQL_ADDRESS 
HASH_VALUE, ADDRESS V$SQLTEXT, V$SQL, V$OPEN_CURSOR HASH_VALUE, ADDRESS 
SQL_TEXT V$DB_OBJECT_CACHE NAME 

示例: 
1.查看消耗资源最多的SQL: 

Sql代码 

  1. SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls  
  2. FROM V$SQLAREA  
  3. WHERE buffer_gets > 10000000 OR disk_reads > 1000000  
  4. ORDER BY buffer_gets + 100 * disk_reads DESC;  


2.查看某条SQL语句的资源消耗: 

Sql代码 

  1. SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls  
  2. FROM V$SQLAREA  
  3. WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');  



查找前10条性能差的sql语句 

Sql代码 

  1. SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea  
  2. order BY disk_reads DESC )where ROWNUM<10 ;  

说明: 
EXECUTIONS表示同一条SQL语句一共执行了多少次,SORTS表示排序的次数,DISK_READS表示物理读的数量。 
DISK_READS NUMBER 
The sum of the number of disk reads over all child cursors 

SORTS NUMBER 
Sum of the number of sorts that were done for all the child cursors 

EXECUTIONS NUMBER 
Total number of executions, totalled over all the child cursors 
分析性能差的sql 

Sql代码 

  1. SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,   
  2. ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,   
  3. ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,   
  4. SQL_TEXT   
  5. FROM V$SQLAREA   
  6. WHERE EXECUTIONS>0   
  7. AND BUFFER_GETS >0   
  8. AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8  

查询共享池中已经解析过的SQL语句及其相关信息 
--EXECUTIONS 所有子游标的执行这条语句次数 
--DISK_READS 所有子游标运行这条语句导致的读磁盘次数 
--BUFFER_GETS 所有子游标运行这条语句导致的读内存次数 
--Hit_radio 命中率 
--Reads_per_run 每次执行读写磁盘数 

笼统的说EXECUTIONS,BUFFER_GETS,Hit_radio越高表示读内存多,磁盘少是比较理想的状态,因此越高越好 
另外两个越高读磁盘次数越多,因此低点好 

选出最占用资源的查询 
   

Sql代码 

  1. select b.username username,a.disk_reads reads,a.executions exec,  
  2.     a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio,  
  3.     a.sql_text statement  
  4.     from v$sqlarea a,dba_users b  
  5.     where a.parsing_user_id=b.user_id  
  6.     and a.disk_reads>100000  

下面是盖国强的一篇博客对v$sqlarea的解释:

Oracle GV$SQLAREA / V$SQLAREA view Definition,Just record for myself.

This is the definition from Oracle10g 10.2.0.3 :

SELECT inst_id, kglnaobj, kglfnobj, kglobt03,
      kglobhs0 + kglobhs1 + kglobhs2 + kglobhs3 + kglobhs4 + kglobhs5
      + kglobhs6,
      kglobt08 + kglobt11, kglobt10, kglobt01, kglobccc, kglobclc, kglhdlmd,
      kglhdlkc, kglobt04, kglobt05, kglobt48, kglobt35, kglobpc6, kglhdldc,
      SUBSTR (TO_CHAR (kglnatim, 'YYYY-MM-DD/HH24:MI:SS'), 1, 19), kglhdivc,
      kglobt12, kglobt13, kglobwdw, kglobt14, kglobwap, kglobwcc, kglobwcl,
      kglobwui, kglobt42, kglobt43, kglobt15, kglobt02,
      DECODE (kglobt32,
              0, 'NONE',
              1, 'ALL_ROWS',
              2, 'FIRST_ROWS',
              3, 'RULE',
              4, 'CHOOSE',
              'UNKNOWN'
              ),
      kglobtn0, kglobcce, kglobcceh, kglobt17, kglobt18, kglobts4, kglhdkmk,
      kglhdpar, kglnahsh, kglobt46, kglobt30, kglobts0, kglobt19, kglobts1,
      kglobt20, kglobt21, kglobts2, kglobt06, kglobt07,
      DECODE (kglobt28, 0, NULL, kglobt28), kglhdadr,
      DECODE (BITAND (kglobt00, 64), 64, 'Y', 'N'),
      DECODE (kglobsta,
              1, 'VALID',
              2, 'VALID_AUTH_ERROR',
              3, 'VALID_COMPILE_ERROR',
              4, 'VALID_UNAUTH',
              5, 'INVALID_UNAUTH',
              6, 'INVALID'
              ),
      kglobt31, kglobtt0, DECODE (kglobt33, 1, 'Y', 'N'), kglhdclt, kglobts3,
      kglobt44, kglobt45, kglobt47, kglobt49, kglobcla, kglobcbca
  FROM x$kglcursor_child_sqlid
WHERE kglobt02 != 0


The fllowing is the definition from Oracle9iR2 9.2.0.4:

SELECT  inst_id, kglnaobj,
        SUM (  kglobhs0
              + kglobhs1
              + kglobhs2
              + kglobhs3
              + kglobhs4
              + kglobhs5
              + kglobhs6
            ),
        SUM (kglobt08 + kglobt11), SUM (kglobt10), SUM (kglobt01),
        COUNT (*) - 1, SUM (DECODE (kglobhs6, 0, 0, 1)),
        DECODE (SUM (DECODE (kglhdlmd, 0, 0, 1)),
                0, 0,
                SUM (DECODE (kglhdlmd, 0, 0, 1)) - 1
                ),
        SUM (kglhdlkc) / 2, SUM (kglobt04), SUM (kglobt05), SUM (kglobpc6),
        SUM (kglhdldc) - 1,
        SUBSTR (TO_CHAR (kglnatim, 'YYYY-MM-DD/HH24:MI:SS'), 1, 19),
        SUM (kglhdivc), SUM (kglobt12), SUM (kglobt13), SUM (kglobt14),
        SUM (kglobt15), SUM (DECODE (kglobt09, 0, kglobt02, 0)),
        DECODE (COUNT (*) - 1,
                1, DECODE (SUM (DECODE (kglobt09, 0, kglobt32, 0)),
                            0, 'NONE',
                            1, 'ALL_ROWS',
                            2, 'FIRST_ROWS',
                            3, 'RULE',
                            4, 'CHOOSE',
                            'UNKNOWN'
                          ),
                'MULTIPLE CHILDREN PRESENT'
                ),
        SUM (DECODE (kglobt09, 0, kglobt17, 0)),
        SUM (DECODE (kglobt09, 0, kglobt18, 0)),
        DECODE (SUM (DECODE (kglhdkmk, 0, 0, 1)),
                0, 0,
                SUM (DECODE (kglhdkmk, 0, 0, 1)) - 1
                ),
        kglhdpar, kglnahsh, kglobts0, kglobt19, kglobts1, kglobt20,
        SUM (kglobt21), SUM (kglobt06), SUM (kglobt07),
        DECODE (kglobt33, 1, 'Y', 'N'), kglhdclt
    FROM x$kglcursor
GROUP BY inst_id,
        kglnaobj,
        kglhdpar,
        kglnahsh,
        kglnatim,
        kglobts0,
        kglobt19,
        kglobts1,
        kglobt20,
        DECODE (kglobt33, 1, 'Y', 'N'),
        kglhdclt
  HAVING SUM (DECODE (kglobt09, 0, kglobt02, 0)) != 0

下面是对上面的博客的评论,可以看到oracle对v$sqlarea的性能方面是在不断改进的。 

 

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/82909169