定位Oracle中的topsql总结.pdfVIP

  • 5
  • 0
  • 约6.65千字
  • 约 6页
  • 2021-10-23 发布于福建
  • 举报
定位 Oracle 中的 top sql 很多时候数据库效率低是少数几个 top sql 造成的,从 top sql 入手进行数据库调优是常用的手段。 10G 中用 sql_id 代替 address 和 hash_value 首先要找出 top sql ,可以从以下几个角度入手: 占用资源最多的 sql : 按照读的次数找 SELECT b.username username,a.sql_id, a.executions exec, a.buffer_gets buffer, a.disk_reads disk, a.parse_calls parse,a.sql_text statement FROM V$SQLAREA a, dba_users b WHERE a.parsing_user_id=b.user_id and ( a.buffer_gets OR a.disk_reads 1000000 ) ORDER BY a.buffer_gets + 100 * a.disk_reads DESC; 也可以将 v$sqlarea 换成 v$sql ,再增加一个 child_number 字段,就可以找到子游标 在 10.2 的版本中推 荐在 v$sqlstats 找。 如果当前已经恢复正常,可以查询 v$active_session_history 打出 top sql 在 DBA_HIST_SQLSTAT 中找 DISK_READS_DELTA 最大的 SQL select snap_id,buffer_gets_delta,disk_reads_delta reads,executions_delta exec,a.sql_id,b.sql_text from dba_hist_sqlstat a,dba_hist_sqltext b where a.sql_id=b.sql_id and (a.BUFFER_GETS_DELTA OR a.disk_reads_delta 1000000) order by a.buffer_gets_delta + 100 * a.disk_reads_delta desc; SELECT b.username username,a.sql_id, a.executions exec, a.buffer_gets buffer, a.disk_reads disk,a.child_number child,PLAN_HASH_VALUE, a.parse_calls parse,a.sql_text statement FROM V$SQL a, dba_users b WHERE a.parsing_user_id=b.user_id and ( a.buffer_gets OR a.disk_reads 1000000 ) ORDER BY a.buffer_gets + 100 * a.disk_reads DESC; 也可以找到 PLAN_HASH_VALUE ,和 v$sql_plan 联合起来查找它的执行计划 列出拥有超过 400 个 cursor 的 sessionID SELECT sid, count(0) ct FROM v$open_cursor GROUP BY sid HAVING COUNT(0) 400 ORDER BY ct desc; 打到排序多的 SQL SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, v$tempseg_usage b, v$sqlarea c WHERE a.saddr = b.session_addr AND c.address= a.sql_address AND c.hash_value = a.sql_hash_value ORDER BY b.tablespace, b.blocks; 也可以按目前的等待事件查找,查看当前会话的等待事件 找出在等 latch 的会话

文档评论(0)

1亿VIP精品文档

相关文档