# oracle系统表v$session、v$sql 查看最近执行了哪些sql语句

数据库 session被一个运行在数据库服务器上或从中间服务器甚至桌面通过 SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息

  • OSUSER:客户端操作系统用户名
  • MACHINE:客户端执行的机器
  • TERMINAL:客户端运行的终端
  • PROCESS:客户端进程的 ID
  • PROGRAM:客户端执行的客户端程序

# session示例

--查找你的 session信息
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
FROM V$SESSION WHERE audsid = userenv( 'SESSIONID' );
--当 machine已知的情况下查找 session
SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
FROM V$SESSION
WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1' ;
--查找当前被某个指定 session正在运行的 sql语句。假设 sessionID为 100
select b.sql_text
from v$session a,v$sqlarea b
where a.sql_hashvalue=b. hash_value and a.sid=  00;
或者
select b.sql_text
from v$session a,v$sqlarea b //v$sqlarea 只包括sql的1000个字符,V$SQLTEXT is all 
where a.sql_hash_value = b.HASH_VALUE and a.TERMINAL = 'BackHam';//BackHam is my computer name;

# V$SQLTEXT中的常用列

  • HASH_VALUE: SQL语句的 Hash值
  • ADDRESS: sql语句在 SGA中的地址
  • SQL_TEXT: SQL文本。
  • PIECE: SQL语句块的序号

# 执行sql查询示例

--查看消耗资源最多的 SQL:
SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls
FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC ;
--查看某条 SQL 语句的资源消耗:
SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls
FROM V$SQLAREA
WHERE hash_Value = 228801498 AND address = hextoraw( 'CBD8E4B0' );
--查找前10条性能差的sql语句 
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea   
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea order BY disk_reads DESC )where ROWNUM<10 ;
--EXECUTIONS表示同一条SQL语句一共执行了多少次,SORTS表示排序的次数,DISK_READS表示物理读的数量。

v$sql视图包含 cursor级别资料。当试图定位 session或用户以分析 cursor时被使用。PLAN_HASH_VALUE列存储的是数值表示的 cursor执行计划。可被用来对比执行计划。 PLAN_HASH_VALUE让你不必一行一行对比即可轻松鉴别两条执行计划是否相同。

V$SQL中的列说明:

  • SQL_TEXT: SQL文本的前 1000个字符
  • SHARABLE_MEM:占用的共享内存大小 (单位: byte)
  • PERSISTENT_MEM:生命期内的固定内存大小 (单位: byte)
  • RUNTIME_MEM:执行期内的固定内存大小
  • SORTS:完成的排序数
  • LOADED_VERSIONS:显示上下文堆是否载入, 1是 0否
  • OPEN_VERSIONS:显示子游标是否被锁, 1是 0否
  • USERS_OPENING:执行语句的用户数
  • FETCHES: SQL语句的 fetch数。
  • EXECUTIONS:自它被载入缓存库后的执行次数
  • USERS_EXECUTING:执行语句的用户数
  • LOADS:对象被载入过的次数
  • FIRST_LOAD_TIME:初次载入时间
  • INVALIDATIONS:无效的次数
  • PARSE_CALLS:解析调用次数
  • DISK_READS:读磁盘次数
  • BUFFER_GETS:读缓存区次数
  • ROWS_PROCESSED:解析 SQL语句返回的总列数
  • COMMAND_TYPE:命令类型代号
  • OPTIMIZER_MODE: SQL语句的优化器模型
  • OPTIMIZER_COST:优化器给出的本次查询成本
  • PARSING_USER_ID:第一个解析的用户 ID
  • PARSING_SCHEMA_ID:第一个解析的计划 ID
  • KEPT_VERSIONS:指出是否当前子游标被使用 DBMS_SHARED_POOL包标记为常驻内存
  • ADDRESS:当前游标父句柄地址
  • TYPE_CHK_HEAP:当前堆类型检查说明
  • HASH_VALUE:缓存库中父语句的 Hash值
  • PLAN_HASH_VALUE:数值表示的执行计划。
  • CHILD_NUMBER:子游标数量
  • MODULE:在第一次解析这条语句是通过调用 DBMS_APPLICATION_INFO.SET_MODULE设置的模块名称。
  • ACTION:在第一次解析这条语句是通过调用 DBMS_APPLICATION_INFO.SET_ACTION设置的动作名称。
  • SERIALIZABLE_ABORTS:事务未能序列化次数
  • OUTLINE_CATEGORY:如果 outline在解释 cursor期间被应用,那么本列将显示出 outline各类,否则本列为空
  • CPU_TIME:解析 /执行 /取得等 CPU使用时间 (单位,毫秒 )
  • ELAPSED_TIME:解析 /执行 /取得等消耗时间 (单位,毫秒 )
  • OUTLINE_SID: outline session标识
  • CHILD_ADDRESS:子游标地址
  • SQLTYPE:指出当前语句使用的 SQL语言版本
  • REMOTE:指出是否游标是一个远程映象 (Y/N)
  • OBJECT_STATUS:对象状态 (VALID or INVALID)
  • IS_OBSOLETE:当子游标的数量太多的时候,指出游标是否被废弃 (Y/N)
--查询$sql示例
select
s.sql_text,
b.name,b.position,b.dup_position,
b.value_string
from v$sql s, v$sql_bind_capture b
where s.hash_value=b.hash_value;