oracle性能分析和调优

本文提供了一系列针对Oracle数据库的SQL性能调优方法,包括如何通过查询v$sql、v$SQLAREA视图来获取SQL执行统计信息,分析SQL执行计划,并检查用户连接及会话状态。此外还介绍了如何监测并调整共享池大小、游标使用情况等关键参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*单条sql统计信息v$sql*/
select a.SQL_TEXT,
       a.EXECUTIONS,
       a.ELAPSED_TIME,
       a.PHYSICAL_READ_BYTES,
       a.LOCKED_TOTAL,
       a.ROWS_PROCESSED
  from v$sql a
 where a.EXECUTIONS > 10
   and a.module = 'JDBC Thin Client'
   and a.LAST_ACTIVE_TIME >
       to_date('2014/5/19 17:49:47', 'yyyy/MM/dd HH24:mi:ss')
 order by a.EXECUTIONS desc
 
 
  /*分组统计 v$SQLAREA  */     
 select sql_text,
        executions,
        disk_reads,
        optimizer_mode,
        buffer_gets,
        hash_value,
        sq.SQL_ID,
        sq.ADDRESS
   from v$SQLAREA sq
  where sq.LAST_ACTIVE_TIME >
        to_date('2014/5/19 17:49:47', 'yyyy/MM/dd HH24:mi:ss')
        and sq.EXECUTIONS>10
        and sq.MODULE='JDBC Thin Client'
        order by sq.EXECUTIONS desc
 
     
  
  
/* 得到某条SQL的查询计划 ,先得到一条sql的地址  */  
 select lpad(' ', 2 * (level - 1)) || operation "Operation",
        options "Options",
        decode(to_char(id),
               '0',
               'Cost=' || nvl(to_char(position), 'n/a'),
               object_name) "Object Name",
        substr(optimizer, 1, 6) "Optimizer"
   from v$sql_plan a
  start with address = '91F413F4'
         and id = 0
 connect by prior id = a.parent_id
        and prior a.address = a.address
        and prior a.hash_value = a.hash_value;
               
/* 用户连接操作数据信息 */
select u.AUDSID,u.SADDR,u.USERNAME,u.STATUS,u.SCHEMANAME,u.MACHINE,u.MODULE from v$SESSION u
/*当前用户*/
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS FROM V$SESSION WHERE audsid = userenv( 'SESSIONID' );
/*查看共享模式参数和配置*/
select * from v$shared_server;
select * from v$dispatcher; 
select * from v$session;






 




 /*扩展,查找十条性能最差的sql,按照磁盘读排序*/
SELECT *
  FROM (select PARSING_USER_ID,
               EXECUTIONS,
               SORTS,
               COMMAND_TYPE,
               DISK_READS,
               sql_text
          FROM v$sqlarea where module = 'JDBC Thin Client'
         order BY disk_reads DESC)
 where ROWNUM < 10
 
 
 
/* 当前数据库环境信息,或者当前用户信息*/
/*返回当前用户环境的信息*/
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE


select userenv('SESSIONID') from dual;
select userenv('LANGUAGE') from dual;


 select 
  SYS_CONTEXT('USERENV','TERMINAL') terminal, 
  SYS_CONTEXT('USERENV','LANGUAGE') language, 
  SYS_CONTEXT('USERENV','SESSIONID') sessionid, 
  SYS_CONTEXT('USERENV','INSTANCE') instance, 
  SYS_CONTEXT('USERENV','ENTRYID') entryid, 
  SYS_CONTEXT('USERENV','ISDBA') isdba, 
  SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory, 
  SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency, 
  SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar, 
  SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format, 
  SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language, 
  SYS_CONTEXT('USERENV','NLS_SORT') nls_sort, 
  SYS_CONTEXT('USERENV','CURRENT_USER') current_user, 
  SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid, 
  SYS_CONTEXT('USERENV','SESSION_USER') session_user, 
  SYS_CONTEXT('USERENV','SESSION_USERID') session_userid, 
  SYS_CONTEXT('USERENV','PROXY_USER') proxy_user, 
  SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid, 
  SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain, 
  SYS_CONTEXT('USERENV','DB_NAME') db_name, 
  SYS_CONTEXT('USERENV','HOST') host, 
  SYS_CONTEXT('USERENV','OS_USER') os_user, 
  SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name, 
  SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address, 
  SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol, 
  SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id, 
  SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id, 
  SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type, 
  SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data 
  from dual;
        
/* 共享模式(SGA)*/
select pool,sum(bytes)/1024/1024 ||'M'  from v$sgastat where pool='shared pool' group by pool;
select * from v$sgastat;
/*增加共享池大小*/
alter system set shared_pool_size = '500M';


select * from v$librarycache ;
/*使用如下语句可以确定库快存和数据字典快存的命中率:*/
select(sum(pins-reloads))/sum(pins) "Lib Cache" from v$librarycache ;
/*共享池中的自由内存可以查看:*/
select * from v$sgastat where name='free memory';
/*1. 检查库快存的活动*/
select sum(pins) "Executions",sum(reloads) "Cache Misses while Executing" from v$librarycache ;






/*每个session最大能够打开的游标数目:*/
select * from v$parameter where name = 'open_cursors'
--每个session(会话)最多能同时打开多少个cursor(游标)  
show parameter open_cursors   
--每个session(会话)最多可以缓存多少个关闭掉的cursor    
show parameter session_cached_cursor;
--是指当前实例的某个时刻的打开的cursor数目        
select count(*) from v$open_cursor; 


/*检查游标设置是否合理*/
SELECT MAX(A.VALUE) AS HIGHEST_OPEN_CUR, P.VALUE AS MAX_OPEN_CUR  
      FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER P  
     WHERE A.STATISTIC# = B.STATISTIC#  
      AND B.NAME = 'opened cursors current'  
       AND P.NAME = 'open_cursors'  
     GROUP BY P.VALUE;   
 
/*是否存在游标泄露 */   
 SELECT A.VALUE, S.USERNAME, S.SID, S.SERIAL#
   FROM V$SESSTAT A, V$STATNAME B, V$SESSION S
  WHERE A.STATISTIC# = B.STATISTIC#
    AND S.SID = A.SID
    AND B.NAME = 'opened cursors curent';
    
    
SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%cursor%';     
SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE '%parse%';
/*游标使用率*/
SELECT 'session_cached_cursors' PARAMETER,
       LPAD(VALUE, 5) VALUE,
       DECODE(VALUE, 0, ' n/a', TO_CHAR(100 * USED / VALUE, '990') || '%') USAGE
  FROM (SELECT MAX(S.VALUE) USED
          FROM V$STATNAME N, V$SESSTAT S
         WHERE N.NAME = 'session cursor cache count'
           AND S.STATISTIC# = N.STATISTIC#),
       (SELECT VALUE FROM V$PARAMETER WHERE NAME = 'session_cached_cursors')
UNION ALL
SELECT 'open_cursors',
       LPAD(VALUE, 5),
       TO_CHAR(100 * USED / VALUE, '990') || '%'
  FROM (SELECT MAX(SUM(S.VALUE)) USED
          FROM V$STATNAME N, V$SESSTAT S
         WHERE N.NAME IN
               ('opened cursors current', 'session cursor cache count')
           AND S.STATISTIC# = N.STATISTIC#
         GROUP BY S.SID),
       (SELECT VALUE FROM V$PARAMETER WHERE NAME = 'open_cursors');



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值