--1.阻塞及等待事件信息查询
-- 查询所有会话的状态、等待类型及当前正在执行的SQL脚本
select t.SID, t.SERIAL#, t.Status, t.Action, t.Event, t.BLOCKING_SESSION, t.BLOCKING_SESSION_STATUS
, t.USERNAME, t.MACHINE, t.PROGRAM, t.sql_exec_start, t.seconds_in_wait
, NVL(s1.sql_id, s2.sql_id) AS sql_id, NVL(s1.SQL_TEXT, s2.SQL_TEXT) AS sql_text
from v$session t
left join v$sql s1 on t.SQL_ID = s1.SQL_ID and t.sql_child_number = s1.child_number
left join v$sql s2 on t.PREV_SQL_ID = s2.SQL_ID and t.prev_child_number = s2.child_number
--where t.PROGRAM = 'w3wp.exe' -- v1. v$session blocking_session is not null
select gs.INST_ID, gs.SID, gs.BLOCKING_INSTANCE, gs.BLOCKING_SESSION
, gs.STATUS, gs.EVENT, gs.USERNAME, gs.MACHINE, gs.PROGRAM
from gv$session gs
where gs.BLOCKING_SESSION is not null; -- v2. v$lock block > 0
select *
from gv$lock
where (ID1, ID2, TYPE) in
(select ID1, ID2, TYPE from gv$lock where block > 0)
order by ID1, block desc; -- v3. dba_waiters
select * from dba_waiters; -- v4. v$locked_object
select l.ORACLE_USERNAME, l.OS_USER_NAME, l.LOCKED_MODE, o.OBJECT_NAME
, s.INST_ID, s.SID, s.STATUS, s.EVENT, s.MACHINE, s.PROGRAM
, s1.SQL_TEXT, s2.SQL_TEXT
from gv$locked_object l
join all_objects o on l.OBJECT_ID = o.OBJECT_ID
join gv$session s on l.INST_ID = s.INST_ID and l.SESSION_ID = s.SID
left join gv$sqlarea s1 on s.INST_ID = s1.INST_ID and s.SQL_ID = s1.SQL_ID
left join gv$sqlarea s2 on s.INST_ID = s2.INST_ID and s.PREV_SQL_ID = s2.SQL_ID -- 根据sid查到阻塞SQL脚本
select se.INST_ID, se.SID, se.serial#, se.status, se.event, se.BLOCKING_INSTANCE, se.BLOCKING_SESSION
, se.USERNAME, se.MACHINE, se.PROGRAM, se.sql_exec_start, se.seconds_in_wait
, tr.xid, tr.start_date, tr.used_ublk, tr.used_urec, NVL(s1.SQL_TEXT, s2.SQL_TEXT) AS sql_text
from gv$session se
left join gv$transaction tr on se.inst_id = tr.inst_id and se.taddr = tr.addr
left join gv$sqlarea s1 on se.INST_ID = s1.INST_ID and se.SQL_ID = s1.SQL_ID
left join gv$sqlarea s2 on se.INST_ID = s2.INST_ID and se.PREV_SQL_ID = s2.SQL_ID
where se.SID in (889, 770); -- 未提交的事务、会话
select t.SID, t.SERIAL#, t.STATUS, t.EVENT
, t.BLOCKING_SESSION, t.BLOCKING_SESSION_STATUS
, t.MACHINE, t.PROGRAM, t.USERNAME
, t.TADDR, tr.XID, tr.STATUS, tr.START_DATE, tr.USED_UBLK, tr.USED_UREC
, nvl(s1.SQL_TEXT, s2.SQL_TEXT) AS sql_text
from v$session t
join v$transaction tr on t.TADDR = tr.ADDR
left join v$sql s1 on t.SQL_ID = s1.SQL_ID and t.SQL_CHILD_NUMBER = s1.CHILD_NUMBER
left join v$sql s2 on t.PREV_SQL_ID = s2.SQL_ID and t.PREV_CHILD_NUMBER = s2.CHILD_NUMBER; -- 查询当前系统的等待事件
SELECT event,
sum(decode(wait_time,0,1,0)) "Curr",
sum(decode(wait_time,0,0,1)) "Prev",
count(*)"Total"
FROM v$session_wait
GROUP BY event
ORDER BY count(*) desc;
--2.查找前10条性能差的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; -- 查询消耗资源最多的SQL
SELECT sql_text, hash_value, executions, buffer_gets, disk_reads, parse_calls
FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 100000
ORDER BY buffer_gets + 100 * disk_reads DESC;

--附
SELECT EXECUTIONS, DISK_READS, BUFFER_GETS
, ROUND((BUFFER_GETS-DISK_READS) / BUFFER_GETS, 2) Hit_radio
, TRUNC(DISK_READS / EXECUTIONS) Reads_per_run
, SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS > 0 AND DISK_READS > 0 and BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS) / BUFFER_GETS < 0.8
ORDER BY 5 DESC;
-- 查看某条SQL语句的资源消耗 
SELECT HASH_VALUE, BUFFER_GETS, DISK_READS, EXECUTIONS, PARSE_CALLS
FROM V$SQLAREA
WHERE HASH_VALUE = 228801498
AND ADDRESS = HEXTORAW('CBD8E4B0'); -- 运行时间很长的SQL(session_longops视图显示运行超过6秒的操作。包括备份,恢复,统计信息收集,查询等等)
select b.USERNAME, b.SID, b.SERIAL#, b.START_TIME, b.LAST_UPDATE_TIME
, round(sofar * 100 / totalwork, 0) || '%' as progress
, a.sql_text
from v$sqlarea a
join v$session_longops b on a.SQL_ID = b.SQL_ID
--where b.TIME_REMAINING != 0 -- TIME_REMAINING:预计完成操作的剩余时间(秒)
-- and b.USERNAME = 'sccot' -- 最近10分钟最消耗CPU的SQL语句:
select sql_text
from (
select sql_id,count(*) as cn
from v$active_session_history
where sample_time > sysdate - 10/24/60
and session_type <> 'BACKGROUND'
and SESSION_STATE = 'ON CPU'
group by sql_id
order by cn desc
) ash, v$sql s
where ash.sql_id=s.sql_id; -- 最近10分钟最消耗IO的SQL语句:
select sql_text
from (
select sql_id,count(*) as cn
from v$active_session_history
where sample_time > sysdate - 10/24/60
and session_type <> 'BACKGROUND'
and WAIT_CLASS='User I/O'
group by sql_id
order by cn desc
) ash, v$sql s
where ash.sql_id=s.sql_id; -- 补充1,根据时间找出响应时间较长的SQL:

select t.SQL_TEXT, t.SQL_FULLTEXT, t.ELAPSED_TIME, t.LAST_LOAD_TIME, t.*
   from v$sql t

where t.LAST_LOAD_TIME > to_char(sysdate - 10/(24*60), 'yyyy-mm-dd/hh24:mi:ss') --and t.sql_text like '%LSHSXM%' 
   order by t.ELAPSED_TIME desc;

 
-- 补充2,查找硬解析严重的SQL:
select max(sql_id), substr(sql_text,0,100), count(1)
from v$sql
where executions < 10
group by substr(sql_text,0,100)
having count(1) > 1000
order by count(1) desc;

--3.统计行数或空间占用较大的表
select t.table_name, t.num_rows, t.last_analyzed, t.temporary, t.*
from user_tables t
where t.num_rows > 0
order by t.num_rows desc -- 普通表数据大小排序
select segment_name, trunc(bytes/1024/1024)
from user_segments
where segment_type = 'TABLE'
order by bytes desc; -- 含LOB类型表的数据大小
SELECT A.TABLE_NAME,
A.COLUMN_NAME,
trunc(B.BYTES / 1024 / 1024),
B.SEGMENT_NAME,
B.SEGMENT_TYPE,
B.TABLESPACE_NAME,
B.BLOCKS,
B.EXTENTS
FROM USER_LOBS A, USER_SEGMENTS B
WHERE A.SEGMENT_NAME = B.SEGMENT_NAME
ORDER BY B.BYTES DESC; -- 数据表总的数据大小占用
select rowSize + nvl(lobSize, 0) dataSize, t1.*, t2.*
from (
select segment_name, trunc(bytes/1024/1024) rowSize
from user_segments
where segment_type = 'TABLE'
) t1 left join (
SELECT A.TABLE_NAME,
A.COLUMN_NAME,
trunc(B.BYTES / 1024 / 1024) lobSize,
B.SEGMENT_NAME,
B.SEGMENT_TYPE,
B.TABLESPACE_NAME,
B.BLOCKS,
B.EXTENTS
FROM USER_LOBS A, USER_SEGMENTS B
WHERE A.SEGMENT_NAME = B.SEGMENT_NAME
) t2 on t1.segment_name = t2.table_name
order by rowSize + nvl(lobSize, 0) desc 补充,查询该表实际使用的blocks:

SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) || DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) AS Used_Blocks
   FROM table_name;


--4.查看Oracle内存参数配置
select *
from v$parameter t
where t.NAME in (
'memory_max_target', 'memory_target', 'sga_max_size', 'sga_target', 'pga_aggregate_target', 'cpu_count'
, 'db_cache_size', 'shared_pool_size', 'large_pool_size', 'java_pool_size', 'streams_pool_size', 'log_buffer'
, 'db_2k_cache_size', 'db_4k_cache_size', 'db_8k_cache_size', 'db_16k_cache_size', 'db_32k_cache_size'
); -- 查询SGA区的分配细节及使用情况
select t1.pool, t1.reserved_size_mb, t2.used_size_mb, t1.reserved_size_mb - t2.used_size_mb AS unused_size_mb
from (
select t.POOL, trunc(sum(t.BYTES)/1024/1024) reserved_size_mb
from v$sgastat t
where t.POOL is not null
group by t.POOL
) t1
left join (
select t.POOL, trunc(sum(t.BYTES)/1024/1024) used_size_mb
from v$sgastat t
where t.pool is not null and t.name != 'free memory'
group by t.POOL
) t2 on t1.pool = t2.pool
union all
select t.name, trunc(sum(t.BYTES)/1024/1024) reserved_size_mb, null, null
from v$sgastat t
where t.pool is null
group by t.NAME
order by 2 desc; -- 查看系统的缓存命中率与软解析率
SELECT 'Cache hit ratio' as name, (1-(physical_reads/(db_block_gets+consistent_gets)))*100 value
FROM v$buffer_pool_statistics
union all
select 'Soft parse ratio', 100-100*(a.value/b.value)
from v$sysstat a, v$sysstat b
Where a.name='parse count (hard)' and b.name='parse count (total)'; --5.查询锁表的语句
select 'kill -9 '||PS.SPID,
'alter system kill session '''||vs.sid||','||vs.serial#||''';',
/* DECODE(V$LOCK.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,*/
Decode(VL.LOCKED_MODE,0,'[0] none',
1,'[1] null 空',
2,'[2] Row-S 行共用(RS):共用表鎖,sub share ',
3,'[3] Row-X 行獨佔(RX):用於行的修改,sub exclusive ',
4,'[4] Share 共用鎖(S):阻止其他DML操作,share',
5,'[5] S/Row-X 共用行獨佔(SRX):阻止其他事務操作,share/sub exclusive ',
6,'[6] exclusive 獨佔(X):獨立訪問使用,exclusive ',
'['||VL.LOCKED_MODE||'] Other Lock') LockMode,
PS.SPID,OS_USER_NAME,VS.PROGRAM,VS.MACHINE,ORACLE_USERNAME,OBJECT_NAME,vs.LOGON_TIME ,
Vs.status,vs.MODULE, NVL(currentSql.SQL_TEXT, prevSql.SQL_TEXT) as sql_text
from V$LOCKED_OBJECT VL
join DBA_OBJECTS OB on VL.OBJECT_ID = OB.OBJECT_ID
join V$SESSION VS on VL.SESSION_ID = VS.SID
join v$process PS on PS.ADDR = VS.PADDR
--left join v$sql currentSql on vs.SQL_HASH_VALUE = currentSql.HASH_VALUE and vs.SQL_ADDRESS = currentSql.ADDRESS
--left join v$sql prevSql on vs.PREV_HASH_VALUE = prevSql.HASH_VALUE and vs.PREV_SQL_ADDR = prevSql.ADDRESS
left join v$sql currentSql on vs.SQL_ID = currentSql.SQL_ID and vs.SQL_Child_Number = currentSql.Child_Number
left join v$sql prevSql on vs.Prev_SQL_ID = prevSql.Sql_Id and vs.PREV_Child_Number = prevSql.Child_Number
order by vs.logon_time;

--6.产生kill会话的语句
select A.SID,
B.SPID,
A.SERIAL#,
a.lockwait,
A.USERNAME,
A.OSUSER,
a.logon_time,
a.last_call_et / 3600 LAST_HOUR,
A.STATUS,
'orakill ' || sid || ' ' || spid HOST_COMMAND,
'alter system kill session ''' || A.sid || ',' || A.SERIAL# || '''' SQL_COMMAND
from v$session A, V$PROCESS B
where A.PADDR = B.ADDR
AND SID > 6; --7.查看IO情况
select
df.name 文件名,
fs.phyrds 读次数,
fs.phywrts 写次数,
(fs.readtim/decode(fs.phyrds,0,-1,fs.phyrds)) 读时间,
(fs.writetim/decode(fs.phywrts,0,-1,fs.phywrts)) 写时间
from v$datafile df,
v$filestat fs
where df.file#=fs.file#
order by df.name; --8.查看表空间情况
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2), '990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC; --9.根据unix上Top命令看到的PID,查找对应的SQl
SELECT P.pid pid,
S.sid sid,
P.spid spid,
S.username username,
S.osuser osname,
P.serial# S_#,
P.terminal,
P.program program,
P.background,
S.status,
RTRIM(SUBSTR(a.sql_text, 1, 80)) SQL
FROM v$process P, v$session S, v$sqlarea A
WHERE P.addr = s.paddr
AND S.sql_address = a.address(+)
AND P.spid LIKE '%CPU最高的进程对应的PID%'; -- 数据库及实例的状态信息
select name, log_mode, open_mode, flashback_on, supplemental_log_data_min, platform_name from v$database;
select instance_number, instance_name, host_name, version, startup_time, status from v$instance; --清空缓存(共享池和数据缓存),Command window执行:
alter system flush shared_pool;
alter system flush buffer_cache; --索引信息查看:
select t.table_owner, t.index_name, t.blevel, t.leaf_blocks
       , t.last_analyzed, t.distinct_keys, t.num_rows, t.sample_size
from user_indexes t where t.table_name = upper('workitem');
 
--analyze table 更新统计信息:
analyze table my_table compute statistics;
analyze index idx_name compute statistics;
--OR
EXEC DBMS_STATS.gather_table_stats(ownname => 'socct', tabname =>'WORKITEM', estimate_percent =>100, cascade =>true, degree =>8, granularity =>'ALL', method_opt => 'for all columns size auto');
/*
参数说明:
一、 estimate_percent :抽样统计百分比
二、 cascade :为 false 时 , 只对表进行统计分析;为 true 时 , 同时对表和索引进行统计分析 .
三、 method_opt :
  method_opt: 决定 histograms 信息是怎样被统计的 .method_opt 的取值如下 :
   for all columns: 统计所有列的 histograms.
   for all indexed columns: 统计所有 indexed 列的 histograms.
   for all hidden columns: 统计你看不到列的 histograms
   for columns <list> SIZE <N> | REPEAT | AUTO | SKEWONLY
     SIZE :统计指定列的 histograms.N 的取值范围 [1,254];
    REPEAT 上次统计过的 histograms;
     AUTO 由 oracle 决定 N 的大小 ;
四、 degree :并发性,可调值为, 8/16/24/32...
*/ --删除数据后,释放数据空间
alter table my_table enable row movement;
alter table my_table shrink space cascade;
alter table my_table disable row movement;
or
alter table table_name move; -- 执行此操作后,需要重建索引

 
select t.NUM_ROWS, t.TEMPORARY, t.last_analyzed, t.* from user_tables t 
where t.TABLE_NAME = upper('gspauresult_tkk0107');

select t.num_rows, t.distinct_keys, t.sample_size, t.last_analyzed, t.* 
from user_indexes t
where t.table_name = upper('tkk007');
select t.* from user_ind_columns t 
where t.TABLE_NAME = upper('gspauresult_tkk0107')
order by t.INDEX_NAME, t.COLUMN_POSITION;

select dbms_metadata.get_ddl('TABLE',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('INDEX',upper('idx_tkk0107')) from dual;
select dbms_metadata.get_ddl('CONSTRAINT',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('REF_CONSTRAINT',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('FUNCTION',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('PACKAGE',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('VIEW',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('TABLESPACE',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('TRIGGER',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('DB_LINK',upper('tkk0107')) from dual;
select dbms_metadata.get_ddl('MATERIALIZED VIEW',upper('tkk0107')) from dual; select * from user_tables t order by dbms_random.random;

获取指定SQL在内存中的执行计划:
select sql_id,child_number,sql_text from v$sql where sql_text like 'select count(1) from emp a where a.dept_no =%';
select * from table(DBMS_XPLAN.DISPLAY_CURSOR('sql_id',0)); 1、PL/SQL Developer 中使用F5
2、explain plan for select count(1) from emp a where a.dept_no=5;
select * from table(dbms_xplan.display());
3、sqlplus中使用 set autotrace traceonly exp;

Oracle常用的性能诊断语句的更多相关文章

  1. [转帖]召冠总的 Oracle常用的性能诊断语句. --保存学习备查

    Copyfrom https://www.cnblogs.com/zhaoguan_wang --1.阻塞及等待事件信息查询-- 查询所有会话的状态.等待类型及当前正在执行的SQL脚本select t ...

  2. SQL Server常用的性能诊断语句

    /* 常规服务器动态管理对象包括: dm_db_*:数据库和数据库对象 dm_exec_*:执行用户代码和关联的连接 dm_os_*:内存.锁定和时间安排 dm_tran_*:事务和隔离 dm_io_ ...

  3. [转帖]召冠总的 SQLSERVER常用的性能诊断语句. --保存学习备查

    CopyFrom https://www.cnblogs.com/zhaoguan_wang /*常规服务器动态管理对象包括:dm_db_*:数据库和数据库对象dm_exec_*:执行用户代码和关联的 ...

  4. ORACLE常用SQL优化hint语句

    在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...

  5. oracle常用运维sql语句

    1.查询dblink语句 col owner for a20col db_link for a30col username for a20col host for a30set linesize 12 ...

  6. Oracle常用函数(SQL语句)

    使用sql函数,您可以在一个select语句的查询当中,直接计算数据库资料的平均值.总数.最小值.最大值.总和.标准差.变异数等统计.使用recordset对象时,也可使用这些sql函数. sql函数 ...

  7. Oracle 常用修改字段SQL语句

    1. 更新字段名称 alter table table_name rename column column_old to column_new; 2. 添加字段 ); 3. 删除字段 alter ta ...

  8. oracle常用的数据字典查询语句

    select * from all_source where owner='user_name' and type = 'PROCEDURE' and upper(text) like upper(' ...

  9. Oracle常用操作表结构的语句

    首先,一起来认识几个单词. alter (改变) rename(重命名) column(柱子,用来表示列) modify(修改) comment on (评论) truncate (删减,截断) 1. ...

随机推荐

  1. UART接口基本知识

    Universal asynchronous transciever即同一异步收发器,也就是我们平时所说的串口,是一种最简单,最基本的通信接口. 通信接口按照不同的标准有不同的分类,常见的有同步或异步 ...

  2. malloc杀内存于无形

    C语言中的malloc函数是分配内存用的,函数内部生命的变量也会分配内存,但是当函数释放的时候内存也就释放了,这样就不会占用内存了,但是malloc函数不同, 如下 typedef struct No ...

  3. javascript运动应用

    多物体运动框架: 1.多个盒子同时运动:move(obj,target)多一个参数 <!DOCTYPE html><html><head> <title> ...

  4. Codeforces

    Codeforces 7E #include <iostream> #include <cstring> #include <cstdio> #include &l ...

  5. Direct3D 10学习笔记(二)——计时器

    本篇将简单整理Direct3D 10的计时器实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译 ...

  6. JS简介

    JS是一本广泛应用于浏览器客户端的脚本语言,由netspace公司设计,当时和sun公司合作,所以名字取得像java JS的常见用途:1)HTML DOM操作(节点操作,比如添加.修改.删除节点 ) ...

  7. iOS的UIDevice,NSBundle,NSLocale

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用 户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取 ...

  8. A - Ice_cream’s world III

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...

  9. Nginx转发地址解决跨域问题

    什么是跨域问题 在一个服务器A里放置了json文件,另一个服务器B想向A发送ajax请求,获取此文件,会发生错误. Chrome提示: XMLHttpRequest cannot load ***** ...

  10. (实用篇)php支付宝接口用法分析

    本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, ...