SQL> desc v$sqltext;

 Name    Null?    Type

 ADDRESS

 HASH_VALUE

 SQL_ID

 COMMAND_TYPE     NUMBER

 PIECE     NUMBER

 SQL_TEXT

但v$sqltext中存储的比较简单,没有该语句的统计信息,比如执行次数等。其中piece表示SQL语句分片之后的顺序编号,比如三行的值为0,1,2, 按照顺序连接起来就是一个完成的SQL语句。sql_text 表示分片后的sql语句的一部分,注意它的长度只有64 bytes . 字段HASH_VALUE 和 address 一起唯一标志一条sql 。

 

 

下面的sql,利用v$session视图里的 PREV_SQL_ADDR, PREV_HASH_VALUE列,确定某个SID或者spid对应的完整SQL

(1)根据sid获得sql语句

select /*+ ORDERED */ sql_text

from v$sqltext

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

where b.sid=&SID)

order by piece asc

 

SQL> select sid,username from v$session;

 

  SID     USERNAME

-------   --------

36

37 SYS  --要查询的当前SYS用户在执行什么语句

38

40

 

26 rows selected.

 

SQL> select /*+ ORDERED */ 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.sid=&SID)

order by piece asc;

Enter value for sid: 37

old   7: where b.sid=&SID)

new   7: where b.sid=37)

 

SQL_TEXT

---------

select /*+ ORDERED */ sql_text from v$sqltext a where (a.hash_va

lue,a.ADDRESS) in ( select decode(sql_hash_value,0,PREV_HASH_VAL

UE,sql_hash_value), decode(sql_hash_value,0,PREV_SQL_ADDR,SQL_AD

DRESS) from v$session b where b.sid=37) order by piece asc

 

(2)根据操作系统pid获得sql语句,这个进程是oracle进程并且是LOCAL=NO

select /*+ ORDERED */ 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 = '&spid'))

order by piece asc

 

以操作系统的process ID为参数。(这个可以通过top命令找出LOCAL=NO的oracle消耗CPU较高的进程PID)

下面是实际生产环境的例子,业务反馈CPU使用率过高,登入到主机使用TOP查看,可以看到使用top命令查看到PID为3193,31433,31690这几个oracle进程使用CPU达到了百分之百了,这里可以使用上面的v$sqltext视图结合v$session和v$process来定位正在运行的占用cpu较高的SQL语句。

oracle@ZJHZ-HW-ZQRZ-WSOP-2:~> top
top - 15:50:18 up 1041 days, 23:28,  6 users,  load average: 11.93, 8.62, 14.23
Tasks: 509 total,  18 running, 490 sleeping,   0 stopped,   1 zombie
Cpu(s): 89.2%us,  1.2%sy,  0.2%ni,  9.1%id,  0.4%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:     23641M total,    22667M used,      973M free,     1534M buffers
Swap:    25583M total,       80M used,    25503M free,    17946M cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
31493 oracle    20   0 16.3g 245m 241m R  100  1.0   3:18.24 oracle                                    
31433 oracle    20   0 16.3g 246m 242m R  100  1.0   3:24.92 oracle                                    
31690 oracle    20   0 16.3g 250m 246m R  100  1.1   3:11.16 oracle                                    
31609 oracle    20   0 16.3g 245m 241m R   99  1.0   3:15.02 oracle                                    
 9645 oracle    20   0 16.3g 320m 316m R   99  1.4   3:33.72 oracle                                    
11860 oracle    20   0 16.3g 374m 370m R   98  1.6   3:44.13 oracle                                    
31553 oracle    20   0 16.3g 243m 239m R   98  1.0   3:22.38 oracle                                    
31222 oracle    20   0 16.3g 247m 243m R   97  1.0   3:25.97 oracle                                    
  456 oracle    20   0 16.3g 321m 316m R   97  1.4   3:36.43 oracle                                    
31127 oracle    20   0 16.3g 247m 243m R   95  1.0   3:29.34 oracle                                    
 5205 oracle    20   0 2958m  79m  18m R   75  0.3   0:02.25 java                                      
 5173 oracle    20   0 98684  21m 7896 S    6  0.1   0:00.18 perl                                      
11357 root      20   0  672m 9556 6232 S    3  0.0  27:11.31 InforGuardMa                              
12016 root      30  10  470m 8256 3212 S    3  0.0   4909:32 hpi_program                               
26379 root      20   0  3876  468  372 S    1  0.0   4711:34 guard-userspace                           
 5162 oracle    20   0  9072 1532  872 R    1  0.0   0:00.03 top                                       
11425 root      20   0  223m  60m 6440 S    1  0.3   1299:53 java                                      
19249 oracle    -2   0 16.3g  15m  14m S    1  0.1   1473:10 oracle                                    
30529 oracle    20   0  9072 1544  876 S    1  0.0   0:01.42 top                                       

oracle@ZJHZ-HW-ZQRZ-WSOP-2:~> sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 28 15:50:34 2018

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, Oracle Label Security, OLAP,
Data Mining, Oracle Database Vault and Real Application Testing options

SQL> select /*+ ORDERED */ 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 = '&spid'))
order by piece asc  2    3    4    5    6    7    8    9   10  
 11  ;
Enter value for spid: 31493   ---输入pid找出对应oracle进程执行sql语句
old   9: where c.spid = '&spid'))
new   9: where c.spid = '31493'))

SQL_TEXT    ---这里定位出消耗CPU较高的SQL语句了,就是这条SQL语句导致CPU使用率达到百分之百,后面就要对这条SQL语句进行分析优化了。
----------------------------------------------------------------
select *  from (select row_.*, rownum rownum_  from (
        SELECT        a.*, b.GROUPCUSTOMERNAME,b.GROUP
CUSTOMERID,m.MEMBERGROUPID           FROM AAA_WSOPGROUPSUBSREG
ISTERLOG a           JOIN AAA_WSOPGROUPCUSTOMER b    ON a.GRO
UPCUSTOMERKEY=b.GROUPCUSTOMERKEY    LEFT JOIN AAA_WSOPMEMBERGROU
P m    ON a.MEMBERGROUPKEY=m.MEMBERGROUPKEY    WHERE EXISTS (
       SELECT :"SYS_B_0" FROM (          SELECT c.GROUP
CUSTOMERKEY          FROM AAA_WSOPCUSTOMERORGREL c
      WHERE EXISTS (               SELECT :"SYS_B_1" FROM (
              SELECT ORGID, PARENTID
   FROM T_BME_ORGANIZATION             START WITH ORGI

SQL_TEXT
----------------------------------------------------------------
D = :1                 CONNECT BY PRIOR ORGID = PARENTID
          ) d            WHERE c.ORGID = d.ORGID
         )          ) e      WHERE a.REGISTERTYPE != :"SYS_
B_2" AND a.STATUS != :"SYS_B_3"     AND a.GROUPCUSTOMERKEY   = e
.GROUPCUSTOMERKEY

               )        order by a.GROUPCUSTOMER
KEY,a.USERNAME          )row_ where rownum <= :"SYS_B_4" ) whe
re rownum_ >= :"SYS_B_5"

20 rows selected.

 

上面例子还结合v$process这张视图,请参考我v$process这篇博客:Oracle v$PROCESS

另外v$sqltext诊断事件案例请参考我的博客: Oracle v$SQLTEXT案例