How to check Oracle database for long running queries

前端 未结 8 1734
半阙折子戏
半阙折子戏 2020-12-02 04:03

My application, which uses an Oracle database, is going slow or appears to have stopped completely.

How can find out which queries are most expensive, so I can inves

相关标签:
8条回答
  • 2020-12-02 04:24

    This one shows SQL that is currently "ACTIVE":-

    select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
    from v$sqltext_with_newlines t,V$SESSION s
    where t.address =s.sql_address
    and t.hash_value = s.sql_hash_value
    and s.status = 'ACTIVE'
    and s.username <> 'SYSTEM'
    order by s.sid,t.piece
    /
    

    This shows locks. Sometimes things are going slow, but it's because it is blocked waiting for a lock:

    select
      object_name, 
      object_type, 
      session_id, 
      type,         -- Type or system/user lock
      lmode,        -- lock mode in which session holds lock
      request, 
      block, 
      ctime         -- Time since current mode was granted
    from
      v$locked_object, all_objects, v$lock
    where
      v$locked_object.object_id = all_objects.object_id AND
      v$lock.id1 = all_objects.object_id AND
      v$lock.sid = v$locked_object.session_id
    order by
      session_id, ctime desc, object_name
    /
    

    This is a good one for finding long operations (e.g. full table scans). If it is because of lots of short operations, nothing will show up.

    COLUMN percent FORMAT 999.99 
    
    SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
    message,( sofar/totalwork)* 100 percent 
    FROM v$session_longops
    WHERE sofar/totalwork < 1
    /
    
    0 讨论(0)
  • 2020-12-02 04:30

    You can use the v$sql_monitor view to find queries that are running longer than 5 seconds. This may only be available in Enterprise versions of Oracle. For example this query will identify slow running queries from my TEST_APP service:

    select to_char(sql_exec_start, 'dd-Mon hh24:mi'), (elapsed_time / 1000000) run_time,
           cpu_time, sql_id, sql_text 
    from   v$sql_monitor
    where  service_name = 'TEST_APP'
    order  by 1 desc;
    

    Note elapsed_time is in microseconds so / 1000000 to get something more readable

    0 讨论(0)
  • 2020-12-02 04:37
    select sq.PARSING_SCHEMA_NAME, sq.LAST_LOAD_TIME, sq.ELAPSED_TIME, sq.ROWS_PROCESSED, ltrim(sq.sql_text), sq.SQL_FULLTEXT
      from v$sql sq, v$session se
     order by sq.ELAPSED_TIME desc, sq.LAST_LOAD_TIME desc;
    
    0 讨论(0)
  • 2020-12-02 04:39

    v$session_longops

    If you look for sofar != totalwork you'll see ones that haven't completed, but the entries aren't removed when the operation completes so you can see a lot of history there too.

    0 讨论(0)
  • 2020-12-02 04:46

    You can generate an AWR (automatic workload repository) report from the database.

    Run from the SQL*Plus command line:

    SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql
    

    Read the document related to how to generate & understand an AWR report. It will give a complete view of database performance and resource issues. Once we are familiar with the AWR report it will be helpful to find Top SQL which is consuming resources.

    Also, in the 12C EM Express UI we can generate an AWR.

    0 讨论(0)
  • 2020-12-02 04:47
    Step 1:Execute the query
    
    column username format 'a10'
    column osuser format 'a10'
    column module format 'a16'
    column program_name format 'a20'
    column program format 'a20'
    column machine format 'a20'
    column action format 'a20'
    column sid format '9999'
    column serial# format '99999'
    column spid format '99999'
    set linesize 200
    set pagesize 30
    select
    a.sid,a.serial#,a.username,a.osuser,c.start_time,
    b.spid,a.status,a.machine,
    a.action,a.module,a.program
    from
    v$session a, v$process b, v$transaction c,
    v$sqlarea s
    Where
    a.paddr = b.addr
    and a.saddr = c.ses_addr
    and a.sql_address = s.address (+)
    and to_date(c.start_time,'mm/dd/yy hh24:mi:ss') <= sysdate - (15/1440) -- running for 15 minutes
    order by c.start_time
    /   
    
    Step 2: desc v$session
    
    Step 3:select sid, serial#,SQL_ADDRESS, status,PREV_SQL_ADDR from v$session where sid='xxxx' //(enter the sid value)
    
    Step 4: select sql_text from v$sqltext where address='XXXXXXXX';
    
    Step 5: select piece, sql_text from v$sqltext where address='XXXXXX' order by piece;
    
    0 讨论(0)
提交回复
热议问题