`

怎么查找oracle比较慢的session和SQL

 
阅读更多
一、如何找到消耗资源大的Oracle的session及其执行的SQL语句
    HP-UX可以用glance,top、IBM- AIX可以用topas、另外可以使用PS命令查看进程。

    通过这些程序我们可以找到用系统资源特别大的这些进程的进程号,我们就可以通过以下的sql语句发现这个pid正在执行哪个sql,这个sql最好在pl/sql developer,toad等软件中执行, 把<>中的spid换成你的spid就可以了。
SELECT a.username,
       a.machine,
       a.program,
       a.sid,
       a.serial#,
       a.status,
       c.piece,
       c.sql_text
  FROM v$session a,
       v$process b,
       v$sqltext c
WHERE b.spid=<spid> 
   AND b.addr=a.paddr
   AND a.sql_address=c.address(+)
ORDER BY c.piece     
    我们就可以把得到的这个sql分析一下,看一下它的执行计划是否走索引,对其优化避免全表扫描,以减少IO等待,从而加快语句的执行速度。
    提示:我在做优化sql时,经常碰到使用in的语句,这时我们一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢。
比如:
SELECT  col1,col2,col3 FROM table1 a
WHERE a.col1 not in (SELECT  col1 FROM table2)
可以换成:
SELECT  col1,col2,col3 FROM table1 a
WHERE not exists
(SELECT  'x'  FROM table2 b
WHERE  a.col1=b.col1)


二、另一个有用的脚本:查找前十条性能差的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 ;

三、迅速发现Oracle Server的性能问题的成因,我们可以求助于v$session_wait这个视图,看系统的这些session在等什么,使用了多少的IO。

参考脚本:

--脚本说明:查看占io较大的正在运行的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


对检索出的结果的几点说明:
1、按每个正在等待的session已经发生的物理读排的序,因为它与实际的IO相关。
2、可以看一下这些等待的进程都在忙什么,语句是否合理?
  Select sql_address from v$session where sid=<sid>;
  Select * from v$sqltext where address=<sql_address>;
执行以上两个语句便可以得到这个session的语句。
你也以用alter system kill session 'sid,serial#';把这个session杀掉。
3、应观注一下event这列,这是我们调优的关键一列,下面对常出现的event做以简要的说明:
A、buffer busy waits,free buffer waits这两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很小或没有的时侯,说明你的系统的dbwr进程决对够用,不用调整;free buffer wait的条目很多,你的系统感觉起来一定很慢,这时说明你的dbwr已经不够用了,它产生的wio已经成为你的数据库性能的瓶颈,这时的解决办法如下:
a.1、增加写进程,同时要调整db_block_lru_latches参数
示例:修改或添加如下两个参数
  db_writer_processes=4
  db_block_lru_latches=8
a.2、开异步IO,IBM这方面简单得多,hp则麻烦一些,可以与Hp工程师联系。


B、db file sequential read,指的是顺序读,即全表扫描,这也是我们应该尽量减少的部分,解决方法就是使用索引、sql调优,同时可以增大db_file_multiblock_read_count这个参数。


C、db file scattered read,这个参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。


D、latch free,与栓相关的了,需要专门调节。


E、其他参数可以不特别观注。



分享到:
评论

相关推荐

    oracle监听执行sql语句

    这条SQL语句通过连接`v$session`和`v$sqlarea`两个视图来获取当前会话中执行的SQL语句及其完整文本。其中`v$session`包含了所有活动会话的信息,而`v$sqlarea`则存储了最近执行过的SQL语句的元数据。通过`a.sql_...

    oracle中已killed session的处理

    - 由于被Killed的进程的物理地址(PADDR)发生了变化,因此无法通过`v$session`和`v$process`视图之间的关联来查找SPID。 - 可以通过以下SQL语句找出存在于`v$process`中但不在`v$session`中的进程: ```sql ...

    有效关闭Oracle死锁进程,和释放状态为killed的session

    在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关重要。以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed...

    Oracle的SQL语句执行效率问题查找与解决方法文.pdf

    3. 监控当前 Oracle 的 session,查看当前 session 中的 SQL 语句执行情况。 4. 使用 Trace 工具,查看数据库服务的初始参数,例如 timed_statistics、user_dump_dest 和 max_dump_file_size 等参数。 二、 Oracle ...

    Oracle性能监控SQL语句

    ### Oracle性能监控SQL语句详解 #### 一、分析表 **知识点:** - **Table Analysis:** ...以上这些SQL语句覆盖了Oracle数据库性能监控的多个方面,能够有效地帮助DBA和开发人员定位和解决问题。

    如何快速的杀掉Oracle的Session

    对于批量结束所有Oracle用户的进程,Windows环境可以执行SQL查询生成批处理文件执行,而在Unix环境中,使用`ps`、`grep`和`awk`命令结合`kill`可一次性结束所有非Oracle守护进程。 需要注意的是,使用`alter system...

    oracle性能优化之SQL语句优化

    Oracle数据库的性能优化是数据库管理员和开发人员关注的重要领域,特别是在处理复杂查询和大量数据时。SQL语句优化是性能优化的关键环节,因为它直接影响到数据的检索速度和资源的消耗。本文将深入探讨SQL语句优化,...

    oracle获得跟踪文件的sql查询语句

    本文将深入探讨如何通过SQL查询语句在Linux和Windows环境下获取Oracle跟踪文件,以及相关的知识点。 首先,`gettrace.sql`、`gettrace2.sql`和`gettraceforwindow.sql`这三份文件可能包含了不同的SQL脚本来查询跟踪...

    Oracle_Kill_Session_终极篇

    ### Oracle_Kill_Session_终极篇:...当遇到难以通过常规手段终止的session时,通过深入理解Oracle内部机制,结合数据库视图和操作系统命令,可以采取一系列措施来确保session的彻底关闭,从而保障数据库的健康运行。

    Oracle数据库日常维护诊断Sql

    根据给定的Oracle数据库日常维护诊断SQL脚本,我们可以从中提炼出多个关键的数据库管理和优化相关的知识点,这些脚本主要用于监控、分析和调整Oracle数据库的性能。以下是对这些脚本的详细解读: ### 1. 查询正在...

    根据oracle数据库sid及serial#查找操作系统sid号

    ### 根据Oracle数据库SID及Serial#查找操作系统SID号 在Oracle数据库管理中,了解如何通过特定的会话标识(SID)以及序列号(Serial#)来查询与该会话关联的操作系统进程ID(PID)是一项重要的技能。这对于诊断性能...

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle数据库管理中,了解SQL语句的执行性能至关重要,特别是执行最慢和最频繁的SQL,它们可能是系统性能瓶颈的主要来源。以下是如何在Oracle环境中查看这些关键信息的详细步骤和解析。 首先,我们来看如何查询...

    清除Oracle中长时间持锁的session

    ### 清除Oracle中长时间持锁的Session #### 背景介绍 在Oracle数据库管理过程中,有时会遇到一些长时间占用资源的进程,这些进程可能会导致数据库性能下降甚至某些操作无法执行。通常情况下,如果一个session的状态...

    Oracle sql 性能优化调整

    Oracle SQL性能优化调整是数据库管理员和开发人员在日常工作中经常面临的重要任务,它涉及到数据库查询速度的提升,资源利用率的优化以及系统整体性能的改善。本文将深入探讨Oracle数据库SQL性能优化的关键点,并...

    查找运行系统里bad sql

    因此,开发者和数据库管理员需要了解如何查找和优化这些 Bad SQL。 第一步,了解什么是 Bad SQL?Bad SQL 通常指的是执行效率低、对系统资源消耗大的 SQL 语句。这些语句可能会导致系统性能下降,增加系统的负载,...

    ORACLE_SQL性能优化(全).ppt

    总的来说,Oracle SQL性能优化是一个综合性的任务,涉及多个层面的技术和策略。理解并掌握这些知识点,结合实际环境进行优化,才能实现数据库性能的最大化。通过持续学习和实践,我们可以不断提升数据库系统的运行...

    快速查找oracle锁对象

    在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...

    Oracle增量数据同步、强制结束正在运行SQL

    通过本文介绍的两种方法,我们不仅了解了如何在Oracle数据库中高效地进行增量数据同步,还学会了如何在必要时安全地终止长时间运行的SQL查询,这对于提高系统的稳定性和响应速度具有重要意义。在实际应用中,可以...

    ORACLE SQL性能优化.rar

    Oracle SQL性能优化是数据库管理员和开发人员关注的重要领域,它涉及到如何通过调整SQL查询、索引策略、数据库架构以及配置参数来提升系统处理数据的速度和效率。以下是对这个主题的详细探讨: 一、SQL查询优化 1. ...

    如何收集Oracle进程中SQL跟踪信息

    在Oracle数据库管理中,收集SQL跟踪信息是诊断和优化系统性能的关键步骤。SQL跟踪能够帮助我们深入了解查询执行的细节,找出潜在的性能瓶颈。本文主要介绍如何在不同情况下收集Oracle进程中的SQL跟踪信息。 首先,...

Global site tag (gtag.js) - Google Analytics