Oracle查看执⾏过的SQL

Oracle查看执⾏过的SQL
ORACLE中可以通过v$session表查看当前有效的session信息,并且可以通过v$session的sql_id或sql_address通过关联查询v$sql查看当前正在执⾏的sql语句;
如果想查看session近期执⾏的sql语句,可以通过v$active_session_history表中的sql_id查看近期历史执⾏的sql语句,要求数据库的liberary没有被fresh。

  1. SELECT b.sql_text, --content of SQL
  2. a.machine, --which machine run this code
  3. a.username, a.module, -- the method to run this SQL
  4. c.sofar / totalwork * 100, --conplete percent
  5. c.elapsed_seconds, --run time
  6. c.time_remaining --remain to run time
  7. FROM v$session a, v$sqlarea b, v$session_longops c
  8. WHERE a.sql_hash_value = b.hash_value(+) AND a.SID = c.SID(+)
  9. AND a.serial# = c.serial#(+)
  10. --AND a.sid=139
    Oracle 最近执⾏过的sql语句:
  11. SELECT sql_text, last_load_time
  12. FROM v$sql
  13. WHERE last_load_time IS NOT NULL
  14. ORDER BY last_load_time DESC
    其它,
    SELECT sql_text,last_load_time FROM v$sql order by last_load_time desc;
    SELECT sql_text, last_load_time FROM v$sql WHERE last_load_time IS NOT NULL and sql_text like 'select%' ORDER BY last_load_time DESC;
    SELECT sql_text, last_load_time FROM v$sql WHERE last_load_time IS NOT NULL and sql_text like 'update%' ORDER BY last_load_time DESC;
    SELECT sql_text, last_load_time FROM v$sql WHERE last_load_time IS NOT NULL and last_load_time like' 14-06-09%' ORDER BY last_load_time DESC;
    监控concurrent 正在执⾏的sql
  15. SELECT a.sid, a.serial#, b.sql_text
  16. FROM v$session a, v$sqltext b
  17. WHERE a.sql_address = b.address
  18. --AND a.sid = <...>
  19. ORDER BY b.piece
    正在执⾏的
  20. SELECT a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT
  21. FROM v$session a, v$sqlarea b
  22. where a.sql_address = b.address
    执⾏过的
  23. SELECT b.SQL_TEXT,b.FIRST_LOAD_TIME,b.SQL_FULLTEXT
  24. FROM v$sqlarea b
  25. WHERE b.FIRST_LOAD_TIME between '2009-10-15/09:24:47' and
  26. '2009-10-15/09:24:47' order by b.FIRST_LOAD_TIME
    (此⽅法好处可以查看某⼀时间段执⾏过的sql,并且 SQL_FULLTEXT 包含了完整的 sql 语句)
    其他
  27. SELECT OSUSER,PROGRAM,USERNAME,SCHEMANAME,B.Cpu_Time,STATUS,B.SQL_TEXT
  28. FROM V$SESSION A LEFT JOIN V$SQL B ON A.SQL_ADDRESS=B.ADDRESS AND A.SQL_HASH_VALUE=B.HASH_VALUE ORDER BY b.cpu_time desc
  29. SELECT address, sql_text, piece
  30. FROM v$session, v$sqltext
  31. WHERE address = sql_address
  32. -- and machine = < you machine name >
  33. ORDER BY address, piece
    查找前⼗条性能差的sql
  34. SELECT * FROM (SELECT PARSING_USER_ID,EXECUTIONS,SORTS,
  35. COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
  36. ORDER BY disk_reads DESC )WHERE ROWNUM<10 ;
    查看占io较⼤的正在运⾏的session
  37. SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,
  38. se.terminal,se.program,se.MODULE,se.sql_address,st.event,st.
  39. p1text,si.physical_reads,
  40. si.block_changes FROM v$session se,v$session_wait st,
  41. v$sess_io si,v$process pr WHERE st.sid=se.sid AND st.
  42. sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.
  43. wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC 以sysdba登录
    sqlplus / as sysdba;
    执⾏如下sql查看最近3天执⾏的delete和truncate操作
    SELECT c.username,
    a.program,
    b.sql_text,
    b.command_type,
    a.sample_time
    FROM dba_hist_active_sess_history a
    JOIN dba_hist_sqltext b
    ON a.sql_id = b.sql_id
    JOIN dba_users c
    ON a.user_id = c.user_id
    WHERE a.sample_time BETWEEN SYSDATE - 3 AND SYSDATE
    AND b.command_type IN (7, 85)
    ORDER BY a.sample_time DESC;
    搜出结果还算有⽤,虽然都是业务删除,记录下
    --查询Oracle正在执⾏的sql语句及执⾏该语句的⽤户
    SELECT b.sid oracleID,
    b.username 登录Oracle⽤户名,
    b.serial#,
    spid 操作系统ID,
    paddr,
    sql_text 正在执⾏的SQL,
    b.machine 计算机名
    FROM v$process a, v$session b, v$sqlarea c
    WHERE a.addr = b.paddr
    AND b.sql_hash_value = c.hash_value
    --查看正在执⾏sql的发起者的发放程序
    SELECT OSUSER 电脑登录⾝份,
    PROGRAM 发起请求的程序,
    USERNAME 登录系统的⽤户名,
    SCHEMANAME,
    B.Cpu_Time 花费cpu的时间,
    STATUS,
    B.SQL_TEXT 执⾏的sql
    FROM V$SESSION A
    LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
    AND A.SQL_HASH_VALUE = B.HASH_VALUE
    ORDER BY b.cpu_time DESC
    --查出oracle当前的被锁对象
posted @ 2022-08-12 07:59  yclizq  阅读(2809)  评论(1编辑  收藏  举报