查询oracle比较慢的session和sql

本文提供了一系列Oracle SQL查询,用于分析数据库性能,包括查找最慢的SQL、占用资源最多的查询、使用频率最高的查询等。通过这些查询,可以帮助数据库管理员快速定位性能瓶颈。


--查询最慢的sql

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

 --查询对应session

select SE.SID,SE.SERIAL#,PR.SPID,
SE.USERNAME,SE.STATUS,SE.TERMINAL,
SE.PROGRAM,SE.MODULE,
SE.SQL_ADDRESS,ST.EVENT,
ST.P1TEXT,SI.PHYSICAL_READS,SI.BLOCK_CHANGES from v$session se,v$session_wait st,
v$sess_io si,v$process pr
where st.SID=se.SID and st.SID=si.SID
AND SE.PADDR=PR.ADDR
AND SE.SID>6
AND ST.WAIT_TIME=0
AND ST.EVENT NOT LIKE '%SQL%'
ORDER BY PHYSICAL_READS DESC;
SELECT sql_address FROM V$SESSION SS,V$SQLTEXT TT
WHERE SS.SQL_HASH_VALUE=TT.HASH_VALUE AND SID=439;
 

v$sqltext:存储的是完整的SQL,SQL被分割

v$sqlarea:存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息(统计)

v$sql:内存共享SQL区域中已经解析的SQL语句。(即时)

 

根据sid查找完整sql语句:

select sql_text from v$sqltext a where a.hash_value = (select sql_hash_value from v$session b where b.sid = '&sid'    )
order by piece asc

 

select a.CPU_TIME,--CPU时间 百万分之一(微秒)
       a.OPTIMIZER_MODE,--优化方式
       a.EXECUTIONS,--执行次数
       a.DISK_READS,--读盘次数
       a.SHARABLE_MEM,--占用shared pool的内存多少
       a.BUFFER_GETS,--读取缓冲区的次数
       a.COMMAND_TYPE,--命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元)
       a.SQL_TEXT,--Sql语句
       a.SHARABLE_MEM,
       a.PERSISTENT_MEM,
       a.RUNTIME_MEM,
       a.PARSE_CALLS,
       a.DISK_READS,
       a.DIRECT_WRITES,
       a.CONCURRENCY_WAIT_TIME,
       a.USER_IO_WAIT_TIME
  from SYS.V_$SQLAREA a
 WHERE PARSING_SCHEMA_NAME = 'CHEA_FILL'--表空间
 order by a.CPU_TIME desc

 

引用:http://jenniferok.iteye.com/blog/700985

从V$SQLAREA中查询最占用资源的查询
select b.username username,a.disk_reads reads,
    a.executions exec,a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio,
    a.sql_text Statement
from  v$sqlarea a,dba_users b
where a.parsing_user_id=b.user_id
 and a.disk_reads > 100000
order by a.disk_reads desc;
用buffer_gets列来替换disk_reads列可以得到占用最多内存的sql语句的相关信息。

v$sql:内存共享SQL区域中已经解析的SQL语句。(即时)

列出使用频率最高的5个查询:
select sql_text,executions
from (select sql_text,executions,
   rank() over
    (order by executions desc) exec_rank
   from v$sql)
where exec_rank <=5;
消耗磁盘读取最多的sql top5:
select disk_reads,sql_text
from (select sql_text,disk_reads,
   dense_rank() over
     (order by disk_reads desc) disk_reads_rank
   from v$sql)
where disk_reads_rank <=5;

找出需要大量缓冲读取(逻辑读)操作的查询:
select buffer_gets,sql_text
from (select sql_text,buffer_gets,
   dense_rank() over
     (order by buffer_gets desc) buffer_gets_rank
   from v$sql)
where buffer_gets_rank<=5;

v$sqlarea字段定义:http://happyhou.blog.sohu.com/60494432.html

SQL_TEXTVARCHAR2(1000)First thousand characters of the SQL text for the current cursor
SQL_IDVARCHAR2(13)SQL identifier of the parent cursor in the library cache
SHARABLE_MEMNUMBERAmount of shared memory used by a cursor. If multiple child cursors exist, then the sum of all shared memory used by all child cursors.
PERSISTENT_MEMNUMBERFixed amount of memory used for the lifetime of an open cursor. If multiple child cursors exist, the fixed sum of memory used for the lifetime of all the child cursors.
RUNTIME_MEMNUMBERFixed amount of memory required during execution of a cursor. If multiple child cursors exist, the fixed sum of all memory required during execution of all the child cursors.
SORTSNUMBERSum of the number of sorts that were done for all the child cursors
VERSION_COUNTNUMBERNumber of child cursors that are present in the cache under this parent
LOADED_VERSIONSNUMBERNumber of child cursors that are present in the cache and have their context heap (KGL heap 6) loaded
OPEN_VERSIONSNUMBERThe number of child cursors that are currently open under this current parent
USERS_OPENINGNUMBERNumber of users that have any of the child cursors open
FETCHESNUMBERNumber of fetches associated with the SQL statement
EXECUTIONSNUMBERTotal number of executions, totalled over all the child cursors
END_OF_FETCH_COUNTNUMBERNumber of times this cursor was fully executed since the cursor was brought into the library cache. The value of this statistic is not incremented when the cursor is partially executed, either because it failed during the execution or because only the first few rows produced by this cursor are fetched before the cursor is closed or re-executed. By definition, the value of the END_OF_FETCH_COUNT column should be less or equal to the value of the EXECUTIONS column.
USERS_EXECUTINGNUMBERTotal number of users executing the statement over all child cursors
LOADSNUMBERNumber of times the object was loaded or reloaded
FIRST_LOAD_TIMEVARCHAR2(19)Timestamp of the parent creation time
INVALIDATIONSNUMBERTotal number of invalidations over all the child cursors
PARSE_CALLSNUMBERSum of all parse calls to all the child cursors under this parent
DISK_READSNUMBERSum of the number of disk reads over all child cursors
DIRECT_WRITESNUMBERSum of the number of direct writes over all child cursors
BUFFER_GETSNUMBERSum of buffer gets over all child cursors
APPLICATION_WAIT_TIMENUMBERApplication wait time
CONCURRENCY_WAIT_TIMENUMBERConcurrency wait time
CLUSTER_WAIT_TIMENUMBERCluster wait time
USER_IO_WAIT_TIMENUMBERUser I/O Wait Time
PLSQL_EXEC_TIMENUMBERPL/SQL execution time
JAVA_EXEC_TIMENUMBERJava execution time
ROWS_PROCESSEDNUMBERTotal number of rows processed on behalf of this SQL statement
COMMAND_TYPENUMBEROracle command type definition
OPTIMIZER_MODEVARCHAR2(25)Mode under which the SQL statement was executed
PARSING_USER_IDNUMBERUser ID of the user that has parsed the very first cursor under this parent
PARSING_SCHEMA_IDNUMBERSchema ID that was used to parse this child cursor
KEPT_VERSIONSNUMBERNumber of child cursors that have been marked to be kept using the DBMS_SHARED_POOL package
ADDRESSRAW(4 | 8)Address of the handle to the parent for this cursor
HASH_VALUENUMBERHash value of the parent statement in the library cache
OLD_HASH_VALUENUMBEROld SQL hash value
MODULEVARCHAR2(64)Contains the name of the module that was executing at the time that the SQL statement was first parsed as set by calling DBMS_APPLICATION_INFO .SET_MODULE
MODULE_HASHNUMBERHash value of the module that is named in the MODULE column
ACTIONVARCHAR2(64)Contains the name of the action that was executing at the time that the SQL statement was first parsed as set by calling DBMS_APPLICATION_INFO .SET_ACTION
ACTION_HASHNUMBERHash value of the action that is named in the ACTION column
SERIALIZABLE_ABORTSNUMBERNumber of times the transaction fails to serialize, producing ORA-08177 errors, totalled over all the child cursors
CPU_TIMENUMBERCPU time (in microseconds) used by this cursor for parsing/executing/fetching
ELAPSED_TIMENUMBERElapsed time (in microseconds) used by this cursor for parsing/executing/fetching
IS_OBSOLETEVARCHAR2(1)Indicates whether the cursor has become obsolete (Y ) or not (N ). This can happen if the number of child cursors is too large.
CHILD_LATCHNUMBERChild latch number that is protecting the cursor
PROGRAM_IDNUMBER

Program identifie

<think>好的,我现在需要帮助用户查询Oracle数据库中最近执行的SQL查询。首先,用户之前的问题是关于如何查看最近执行的SQL语句,而现在的需求更具体,是要找到查询。我需要结合之前的引用内容,同时考虑如何筛选出执行效率低的SQL。 首先,用户提供的引用[^1]中提到了使用v$sql视图,按last_load_time排序。但用户现在需要的是SQL,所以可能需要更多的字段,比如执行时间、磁盘读取等。我应该想到Oracle中常用的性能视图,比如v$sqlstats或v$sqlarea,这些视图中可能包含执行时间、CPU时间、磁盘读取等指标。 接下来,我需要确定哪些字段可以反映SQL的执行效率。通常,ELAPSED_TIME表示总耗时,CPU_TIME是CPU时间,DISK_READS是磁盘读取次数,这些数值高可能意味着SQL效率低下。用户可能需要根据这些指标进行排序,找出耗时长的查询。 然后,考虑如何编写SQL语句。应该从v$sql或v$sqlarea中选择这些字段,并按照ELAPSED_TIME降序排列,限制结果数量。例如使用ROWNUM <= 10来获取前10条最SQL。同时,需要注意权限问题,用户可能需要访问这些动态性能视图的权限,比如授予SELECT_CATALOG_ROLE。 另外,用户可能需要历史数据的分析,这时候需要想到AWR报告。AWR会定期收集性能数据,可以通过DBA_HIST_SQLSTAT等视图查询历史SQL。但生成AWR报告需要额外的权限,可能需要DBA角色的协助。 还要考虑示例的提供,用户可能需要具体的代码示例,因此我需要写出具体的SQL查询语句,并解释每个字段的含义。例如,展示如何选择SQL_TEXT、ELAPSED_TIME等字段,并按照时间排序。 最后,生成相关问题时要覆盖性能分析、优化方法、监控工具等方面,帮助用户进一步解决问题。比如如何分析执行计划,优化索引,或者使用SQL Trace工具等。</think>在Oracle数据库中查询SQL需要结合性能视图耗时指标,以下是具体方法: 1. 使用v$sql视图筛选高耗时SQL ```sql SELECT sql_id, sql_text, elapsed_time/1000000 as elapsed_seconds, cpu_time/1000000 as cpu_seconds, disk_reads, executions, last_active_time FROM v$sql WHERE elapsed_time > 1000000 -- 筛选执行超过1秒的SQL ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY; ``` 字段说明: - $elapsed_time$:总执行时间(微秒) - $cpu_time$:消耗CPU时间(微秒) - $disk_reads$:物理读次数 - $last_active_time$:最后执行时间戳[^1] 2. 通过AWR报告获取历史数据 ```sql SELECT sql_id, sql_text, elapsed_time_delta/1000000 as elapsed_sec, executions_delta FROM dba_hist_sqlstat WHERE snap_id BETWEEN &begin_snap AND &end_snap ORDER BY elapsed_time_delta DESC; ``` 需要DBA权限,建议生成完整AWR报告: ```shell $ORACLE_HOME/rdbms/admin/awrrpt.sql ``` 3. 实时监控工具 - 使用SQL Monitor: ```sql SELECT dbms_sqltune.report_sql_monitor(sql_id => 'g54sd5az5a1sh') FROM dual; ``` - 启用SQL Trace: ```sql ALTER SESSION SET tracefile_identifier = 'slow_sql'; ALTER SESSION SET events '10046 trace name context forever, level 12'; ``` **注意事项**: 1. 需要授予用户`SELECT_CATALOG_ROLE`权限 2. 建议配合`DBMS_XPLAN`查看执行计划: ```sql SELECT * FROM TABLE(dbms_xplan.display_cursor('sql_id')); ``` 3. SQL阈值建议设置为:OLTP系统0.5秒,OLAP系统2秒
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值