oracle巡检_999

http://bearlovecat.blog.51cto.com/1293914/865698

所有企业的业务数据库系统都是重中之重,如何来保证系统安全性与稳定性,需要DBA每日来通过相应的巡检指标进行相关记录,今天我们就来简单说一下

OS健康检测

将CPU、内存、磁盘I/O状况、网络状况等填到上午高峰期检查情况和下午高峰期检查情况栏里。对于CPU和内存、磁盘IO记录数值,对于网络状况,记录正常或不正常。

检测CPU情况

clip_image001

可以看到,1分钟,5分钟,15分钟的负载都为0,系统很健康的说

检测内存状况

clip_image002

可以看到,内存虽然占用了90%以上,但是SWAP交换分区并没有被占用,所以属于业务正常情况

检测硬盘状况

clip_image003

可以看到,文件系统只用到了不足10%,还有很大的磁盘空间,很健康

通过vmstat命令检测系统

clip_image004

Linux 内存监控vmstat命令输出分成六个部分:(参考资料:http://blog.csdn.net/lengyuhong/article/details/5855056

1、进程procs:

r:在运行队列中等待的进程数 。

b:在等待io的进程数 。

2、Linux 内存监控内存memoy:

swpd:现时可用的交换内存(单位KB)。

free:空闲的内存(单位KB)。

buff: 缓冲去中的内存数(单位:KB)。

cache:被用来做为高速缓存的内存数(单位:KB)。

3、Linux 内存监控swap交换页面

si: 从磁盘交换到内存的交换页数量,单位:KB/秒。

so: 从内存交换到磁盘的交换页数量,单位:KB/秒。

4、Linux 内存监控 io块设备:

bi: 发送到块设备的块数,单位:块/秒。

bo: 从块设备接收到的块数,单位:块/秒。

5、Linux 内存监控system系统:

in: 每秒的中断数,包括时钟中断。

cs: 每秒的环境(上下文)转换次数。

6、Linux 内存监控cpu中央处理器:

cs:用户进程使用的时间。以百分比表示。

sy:系统进程使用的时间。以百分比表示。

id:中央处理器的空闲时间。以百分比表示。

假如r经常大于4,且id经常小于40,表示中央处理器的负荷很重。 假如bi,bo 长期不等于0,表示物理内存容量太小。

通过iostat命令检测系统

clip_image005

比较重要的参数(参考资料:http://blog.csdn.net/wyzxg/article/details/3985221 )

%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的

svctm: 平均每次设备I/O操作的服务时间

await: 平均每次设备I/O操作的等待时间

avgqu-sz: 平均I/O队列长度

如果%util接近100%,表明i/o请求太多,i/o系统已经满负荷,磁盘可能存在瓶颈,一般%util大于70%,i/o压力就比较大,读取速度有较多的wait.同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。

await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢。

通过sar命令检测系统

clip_image006

sar命令较为复杂,牵扯参数较多,这里就不再详解了

检测Oralce进程

clip_image007

Oracle后台进程是oracle实例的重要组成部分,后台进程是否正常工作直接决定了Oracle运行的正常与否。如果Oracle后台进程停止,将导致Oracle实例的崩溃。(最少应该有dbwr、lgwr、smon、pmon、ckpt等几个主要进程)

检测Oracle监听

clip_image008

Oracle监听进程侦听从客户端(如应用服务器)发来的对数据库的连接请求,然后为该请求建立一个连接。如果监听进程关闭,则无法建立起应用服务器与数据库服务器之间的连接。(SID最少应该有一个为READY状态)

检测Oracle死锁

clip_image009

死锁是由于2个session互相交叉阻塞对方而产生的,Oracle会自动探测到死锁并回滚其中的一个事务。死锁一般是由于应用逻辑造成的,发生死锁时,需要将导致死锁的SQL反馈给开发人员,以进一步解决。(也应该时常检测alert日志,看看有没有严重的或者频繁出现的ORA-错误并解决)

Oracle检测

检查Oracle实例状态

clip_image010

正常情况下,Oracle实例状态处于OPEN状态,通过检查此项,可以确定Oracle实例是否正常。

检查Oracle数据库状态

clip_image011

通过查看Oracle数据库状态,可以检查数据库名称、数据库归档模式、数据库打开模式,从而确定数据库是否处于正常的状态。(测试库未开启归档,属于正常)

检查Oracle会话状态

clip_image012

当前会话数是当前从应用服务器到数据库服务器之间建立的连接数量,这个数量与数据库的负载之间有密切的联系,一个稳定运行的数据库里,会话数量应保持平稳,如果出现会话数量大幅增加或大幅减少,就意味着可能出现了问题,需要进一步查找原因。(需要与日常稳定数值对比)

检查锁等待会话

clip_image013

通过查看会话的锁等待状况,可以了解数据库中是否有锁资源争用的现象,如果出现了时间较长的锁等待现象,可能会严重影响业务的正常运行。因此,如果在检查中发现数据库锁等待问题,需要进一步检查问题发生的原因。(返回值为0,表示正常)

检查控制文件状态

clip_image014

控制文件是数据库的重要组成部分,如果所有的控制文件发生损坏,将导致数据库无法打开,通过检查控制文件状态,可以及时发现损坏的控制文件,及时采取补救措施。(STATUS为空,状态正常)

检查Oracle重做日志文件状态

clip_image015

重做日志文件是oracle数据库的重要组成部分,通过检查重做日志文件可以及时发现重做日志文件出现的损坏等问题。(STATUS为空,TYPE为ONLINE,状态正常)

检查Oracle表空间状态

clip_image016

正常情况下,表空间应处于online状态,如果表空间处于offline状态,则用户将无法访问表空间,通过检查表空间状态,可以及时发现那些表空间处于非正常状态。(STATUS为ONLINE,状态正常)

检查Oracle回滚段状态

clip_image017

在回滚段处于自动管理的模式下,回滚段的状态是自动转换的,由Oracle控制。(STATUS为ONLINE,状态正常)

检查Oracle数据文件状态

clip_image018

通过检查Oracle数据文件状态,可以及时发现发生数据损坏的数据文件。(STATUS:系统表空间为SYSTEM,其余表空间为ONLINE,状态正常)

检查Oracle所有对象状态

clip_image019

在正常情况下,数据库中所有对象状态都应该是VALID,如果出现了处于INVALID状态的对象,则需要进一步检查,确定是否需要重新编译。(无返回值,状态正常)

检查Oracle相关资源使用情况

clip_image020

通过查看v$resource_limit视图,可以查看数据库初始化参数设置是否合理,如果有不合理或者超过参数设置范围的情况,就需要考虑进行适当的调整。(返回结果中“LIMIT_VALU”‐“MAX_UTILIZATION”>5,状态正常)

检查Oracle表空间增长情况

clip_image021

Oracle数据库的数据是存放在表空间里,如果表空间剩余空间不足,数据库无法继续写入数据,数据库将报错。因此,及时检查表空间使用情况,确保表空间剩余空间维持在20%以上,对数据库的正常稳定运行来说具有重要意义。(所有表空间的PCT_FREE均大于20%,状态正常)

检查Oracle扩展异常对象

clip_image022

数据库中每个segment是由extent组成,而每个segment所能容纳的extent数量是有限制的,dba_segments中的max_extents列就是每个segment所能容纳的最大extent数量。如果segment中的extent数达到了这个数量的限制,则segment将无法继续扩展,数据库将报错。因此,通过检查每个segment中的extent数量,可以及时发现数据库中扩展异常的对象,以便于采取进一步参数,避免出现segment无法扩展的问题出现。(无返回值,状态正常)

检查Oracle系统表空间

clip_image023

Oracle系统表空间一般是用于存放sys和system用户数据的,通常其它用户的数据是不能存放在系统表空间中,通过检查这项内容,可以发现有哪些非sys和system用户的数据被存放在系统表空间里,以防止其存储空间被过度占用而引起数据库问题。(此类用户属于内部用户,状态正常)

除了上述基本检测外,还需要检测每日的RMAN备份情况(全备或者增量备份),逻辑备份情况(EXPDP或EXP),并生成statspack与AWR报告,对数据库进行具体性能分析。

 

http://thomas0988.iteye.com/blog/1157898

SQL-1 =====查看控制文件
SQL-2 =====查看日志文件
SQL-3 =====查看表空间使用情况
SQL-4 =====查看数据库库对象
SQL-5 =====查看数据库的版本
SQL-6 =====查看数据库创建日期和归档方式
SQL-7 =====捕捉运行很久的SQL
SQL-8 =====查看数据表的参数信息
SQL-9 =====查看表空间的名称及大小
SQL-10 =====表空间相关查询方法
SQL-11 =====查看回滚段名称及大小
SQL-12 =====查看当前SQL*PLUS 用户的sid 和serial
SQL-13 =====如何查看当前数据库的字符集
SQL-14 =====查询SQL优化方式
SQL-15 =====查看系统当前最新的SCN号
SQL-16 =====查看TRACE文件脚本
SQL-17 =====查看客户端登陆IP
SQL-18 =====创建追踪客户端IP 地址
SQL-19 =====查看数据库当前日期
SQL-20 =====查看Disk Read 最高的SQL
SQL-21 =====查找前十条性能差的sql
SQL-22 =====获取等待时间最多的5 个系统等待事件
SQL-23 =====检查Oracle回滚段状态
SQL-24 =====检查Oracle回滚段扩展信息
SQL-25 =====Oracle杀会话的脚本
SQL-26 =====查看排序段的性能
SQL-27 =====查看数据库对象
SQL-28 =====查看尚未提交的事务
SQL-29 =====查找object 为哪些进程所用
SQL-30 =====查看回滚段
SQL-31 =====耗资源的进程(top session)
SQL-32 =====根据PID查找相应的语句
SQL-33 =====监控当前数据库谁在运行什么SQL语句
SQL-34 =====监控数据库某用户在运行什么SQL
SQL-35 =====查询前台正在发出的sql 语句
SQL-36 =====查询当前所执行的SQL语句
SQL-37 =====监控消耗CPU最高的进程所对应的SQL语句
SQL-38 =====监控CPU使用率最高的2 条SQL语句
SQL-39 =====查询锁(Lock)情况
SQL-40 =====DBA监控数据库死锁
SQL-41 =====查看等待(wait)情况
SQL-42 =====查看sga 情况
SQL-43 =====查看catched object
SQL-44 =====查看V$SQLAREA
SQL-45 =====查看object 分类数量
SQL-46 =====查看connection 的相关信息
SQL-47 =====查询有哪些数据库实例在运行
SQL-48 =====查看表是否是分区表
SQL-49 =====查看分区表的分区名和相应的表空间名
SQL-50 =====查看索引是否是分区索引
SQL-51 =====Dual表的用法,常用在没有目标表的Select 中
SQL-52 =====查看索引段中extent 的数量
SQL-53 =====查看系统表空间中的非管理员索引
SQL-54 =====查看system 表空间内的索引的扩展情况
SQL-55 =====查看表空间数据文件的读写性能
SQL-56 =====转换表空间为local 方式
SQL-57 =====查看一下哪个用户在用临时段
SQL-58 =====查看占io较大的正在运行的session
SQL-59 =====查找前十条性能差的sql
SQL-60 =====删除用户下所有表的语句
SQL-61 =====查看LOCK并杀掉会话
SQL-62 =====识别IO 竞争和负载平衡
SQL-63 =====查看哪些session 正在使用哪些回滚段
SQL-64 =====查看WACOS 表空间下所有的索引
==========================================================
SQL-1 =====查看控制文件
==========================================================
select name from v$controlfile;
==========================================================
SQL-2 =====查看日志文件
==========================================================
select member from v$logfile;
==========================================================
SQL-3 =====查看表空间使用情况
==========================================================
select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space
group by tablespace_name;
==========================================================
SQL-4 =====查看数据库库对象
==========================================================
select owner, object_type, status, count(*) count# from all_objects group by owner,
object_type, status;
==========================================================
SQL-5 =====查看数据库的版本
==========================================================
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';
==========================================================
SQL-6 =====查看数据库创建日期和归档方式
==========================================================
Select Created, Log_Mode, Log_Mode From V$Database;
==========================================================
SQL-7 =====捕捉运行很久的SQL
==========================================================
column username format a12
column opname format a16
column progress format a8
select username,sid,opname, round(sofar*100 / totalwork,0) || '%' as progress,
time_remaining,sql_text
from v$session_longops , v$sql
where time_remaining <> 0
and sql_address = address
and sql_hash_value = hash_value
==========================================================
SQL-8 =====查看数据表的参数信息
==========================================================
SELECT partition_name, high_value, high_value_length, tablespace_name,
pct_free, pct_used, ini_trans, max_trans, initial_extent,
next_extent, min_extent, max_extent, pct_increase, FREELISTS,
freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks,
empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size,
last_analyzed
FROM dba_tab_partitions
--WHERE table_name = :tname AND table_owner = :towner
ORDER BY partition_position
==========================================================
SQL-9 =====查看表空间的名称及大小
==========================================================
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d where t.tablespace_name =
d.tablespace_name group by t.tablespace_name;
==========================================================
SQL-10 =====表空间相关查询方法
==========================================================
SQL>select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0)
total_space from dba_data_files order by tablespace_name;
SQL>select distinct file_name,tablespace_name,AUTOEXTENSIBLE from
dba_data_files;
**查询表空间使用情况
SQL>select sum(bytes)/(1024*1024) as free_space,tablespace_name from
dba_free_space group by tablespace_name;
SQL>SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED,
C.BYTES FREE,(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES
"% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND
A.TABLESPACE_NAME=C.TABLESPACE_NAME;
SQL>column tablespace_name format a18;
SQL>column Sum_M format a12;
SQL>column Used_M format a12;
SQL>column Free_M format a12;
SQL>column pto_M format 9.99;
SQL>select s.tablespace_name,ceil(sum(s.bytes/1024/1024))||'M'
Sum_M,ceil(sum(s.UsedSpace/1024/1024))||'M'
Used_M,ceil(sum(s.FreeSpace/1024/1024))||'M' Free_M,
sum(s.UsedSpace)/sum(s.bytes) PTUSED
from (select b.file_id,b.tablespace_name,b.bytes, (b.bytes-sum(nvl(a.bytes,0)))
UsedSpace, sum(nvl(a.bytes,0)) FreeSpace,(sum(nvl(a.bytes,0))/(b.bytes)) * 100
FreePercentRatio
from sys.dba_free_space a,sys.dba_data_files b
where a.file_id(+)=b.file_id group by
b.file_id,b.tablespace_name,b.bytes order by b.tablespace_name) s
group by s.tablespace_name
order by sum(s.FreeSpace)/sum(s.bytes) desc;
数据库各个表空间增长情况的检查:
SQL>select A.tablespace_name,(1-(A.total)/B.total)*100 used_percent
From (select tablespace_name,sum(bytes) total from dba_free_space group by
tablespace_name) A,(select tablespace_name,sum(bytes) total from dba_data_files
group by tablespace_name) B where A.tablespace_name=B.tablespace_name;
SQL>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;
查看各个表空间占用磁盘情况:
SQL>col tablespace_name format a20;
SQL>select b.file_id file_ID,
b.tablespace_name tablespace_name,
b.bytes Bytes,
(b.bytes-sum(nvl(a.bytes,0))) used,
sum(nvl(a.bytes,0)) free,
sum(nvl(a.bytes,0))/(b.bytes)*100 Percent
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id;
数据库对象下一扩展与表空间的free扩展值的检查:
SQL>select a.table_name, a.next_extent, a.tablespace_name
from all_tables a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name =
a.tablespace_name and a.next_extent > f.big_chunk
union select a.index_name, a.next_extent, a.tablespace_name
from all_indexes a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name =
a.tablespace_name and a.next_extent > f.big_chunk;
查询表空间使用情况:
select a.tablespace_name "表空间名称",
100-round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2) "占用率(%)",
round(a.bytes_alloc/1024/1024,2) "容量(M)",
round(nvl(b.bytes_free,0)/1024/1024,2) "空闲(M)",
round((a.bytes_alloc-nvl(b.bytes_free,0))/1024/1024,2) "使用(M)",
Largest "最大扩展段(M)",to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "采样时间"
from (select f.tablespace_name,sum(f.bytes) bytes_alloc,
sum(decode(f.autoextensible,'YES',f.maxbytes,'NO',f.bytes)) maxbytes
from dba_data_files f group by tablespace_name) a,
(select f.tablespace_name,sum(f.bytes) bytes_free
from dba_free_space f group by tablespace_name) b,
(select round(max(ff.length)*16/1024,2) Largest,ts.name tablespace_name
from sys.fet$ ff, sys.file$ tf,sys.ts$ ts
where ts.ts#=ff.ts# and ff.file#=tf.relfile# and ts.ts#=tf.ts#
group by ts.name, tf.blocks) c where a.tablespace_name = b.tablespace_name and
a.tablespace_name = c.tablespace_name;
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;
查询表空间的碎片程度:
SQL>select tablespace_name,count(tablespace_name) from dba_free_space group by
tablespace_name having count(tablespace_name)>10;
SQL>alter tablespace name coalesce;
SQL>alter table table_name deallocate unused;
SQL>create or replace view ts_blocks_v as
select tablespace_name,block_id,bytes,blocks,'free space' segment_name from
dba_free_space union all
select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
SQL>select * from ts_blocks_v;
SQL>select tablespace_name,sum(bytes),max(bytes),count(block_id) from
dba_free_space group by tablespace_name;
SQL>select 'alter tablespace '||TABLESPACE_NAME||' coalesce;'
from DBA_FREE_SPACE_COALESCED where
PERCENT_EXTENTS_COALESCED<100
or PERCENT_BLOCKS_COALESCED<100;
由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可
用fsfi--free space fragmentation index(自由空间碎片索引)值来直观体现:
fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))
rem fsfi value compute
rem fsfi.sql
column fsfi format 999,99
select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
group by tablespace_name order by 1;
spool fsfi.rep;
/
spool off;
可以看出,fsfi 的最大可能值为100(一个理想的单文件表空间)。随着范
围的增加,fsfi 值缓慢下降,而随着最大范围尺寸的减少,fsfi 值会迅速下降。
比如,在某数据库运行脚本fsfi.sql,得到以下fsfi 值:
tablespace_name fsfi
------------------------------ -------
rbs 74.06
system 100.00
temp 22.82
tools 75.79
users 100.00
user_tools 100.00
ydcx_data 47.34
ydcx_idx 57.19
ydjf_data 33.80
ydjf_idx 75.55
---- 统计出了数据库的fsfi 值,就可以把它作为一个可比参数。在一个有着足够
有效自由空间,且fsfi 值超过30 的表空间中,很少会遇见有效自由空间的问题。
当一个空间将要接近可比参数时,就需要做碎片整理了。
==========================================================
SQL-11 =====查看回滚段名称及大小
==========================================================
SQL>select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+) order by segment_name;
==========================================================
SQL-12 =====查看当前SQL*PLUS 用户的sid 和serial
==========================================================
SQL>select sid, serial#, status from v$session where audsid=userenv('sessionid');
==========================================================
SQL-13 =====如何查看当前数据库的字符集
==========================================================
SQL>select userenv('language') from dual;
SQL>select userenv('lang') from dual;
==========================================================
SQL-14 =====查询SQL优化方式
==========================================================
用explain plan 产生EXPLAIN PLAN,检查PLAN_TABLE 中ID=0 的POSITION
列的值。
SQL>select decode(nvl(position,-1),-1,'RBO',1,'CBO') from plan_table where id=0;
==========================================================
SQL-15 =====查看系统当前最新的SCN号
==========================================================
SQL>select max(ktuxescnw * power(2,32) + ktuxescnb) from x$ktuxe;
==========================================================
SQL-16 =====查看TRACE文件脚本
==========================================================
在ORACLE中查找TRACE文件的脚本:
select u_dump.value || '/' || instance.value || '_ora_' ||
v$process.spid || nvl2(v$process.traceid, '_' || v$process.traceid, null ) || '.trc'"Trace
File" from v$parameter u_dump cross join v$parameter instance cross join v$process
join v$session on v$process.addr = v$session.paddr where u_dump.name =
'user_dump_dest' and
instance.name = 'instance_name' and
v$session.audsid=sys_context('userenv','sessionid');
==========================================================
SQL-17 =====查看客户端登陆IP
==========================================================
SQL>select sys_context('userenv','ip_address') from dual;
==========================================================
SQL-18 =====创建追踪客户端IP 地址
==========================================================
SQL>create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
==========================================================
SQL-19 =====查看数据库当前日期
==========================================================
SQL> select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
==========================================================
SQL-20 =====查看Disk Read 最高的SQL
==========================================================
SQL>select sql_text from (select * from v$sqlarea order by disk_reads)
where rownum<=5;
==========================================================
SQL-21 =====查找前十条性能差的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-22 =====获取等待时间最多的5 个系统等待事件
==========================================================
SQL>select * from (select * from v$system_event where event not like 'SQL%' order
by total_waits desc) where rownum<=5;
==========================================================
SQL-23 =====检查Oracle回滚段状态
==========================================================
SQL>select
segment_name,owner,tablespace_name,initial_extent,next_extent,dba_rollback_segs.s
tatus from dba_rollback_segs,v$datafile where file_id=file#;
==========================================================
SQL-24 =====检查Oracle回滚段扩展信息
==========================================================
col name format a10
set linesize 140
select substr(name,1,40)
name,extents,rssize,optsize,aveactive,extends,wraps,shrinks,hwmsize
from v$rollname rn,v$rollstat rs where (rn.usn=rs.usn);
extents:回滚段中的盘区数量。
Rssize:以字节为单位的回滚段的尺寸。
optsize:为optimal 参数设定的值。
Aveactive:从回滚段中删除盘区时释放的以字节为单位的平均空间的大小。
Extends:系统为回滚段增加的盘区的次数。
Shrinks:系统从回滚段中清除盘区(即回滚段收缩)的次数。回滚段每次清除盘
区时,系统可能会从这个回滚段中消除一个或多个盘区。
Hwmsize:回滚段尺寸的上限,即回滚段曾经达到的最大尺寸。
(如果回滚段平均尺寸接近OPTIMAL的值,那么说明OPTIMAL的值设置正确,
如果回滚段动态增长次数或收缩次数很高,那么需要提高OPTIMAL的值)
==========================================================
SQL-25 =====Oracle杀会话的脚本
==========================================================
select
A.SID,B.SPID,A.SERIAL#,a.lockwait,A.USERNAME,A.OSUSER,a.logon_time,a.la
st_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;
==========================================================
SQL-26 =====查看排序段的性能
==========================================================
SQL>SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)',
'sorts (disk)');
==========================================================
SQL-27 =====查看数据库对象
==========================================================
select owner, object_type, status, count(*) count# from all_objects group by owner,
object_type, status;
==========================================================
SQL-28 =====查看尚未提交的事务
==========================================================
select * from v$locked_object;
select * from v$transaction;
==========================================================
SQL-29 =====查找object 为哪些进程所用
==========================================================
select p.spid,s.sid,s.serial# serial_num,s.username user_name,
a.type object_type,s.osuser os_user_name,a.owner,a.object
object_name,decode(sign(48 - command),1,
to_char(command), 'Action Code #' || to_char(command) ) action,
p.program oracle_process,s.terminal terminal,s.program program,s.status
session_status from v$session s, v$access a, v$process p where s.paddr = p.addr
and s.type = 'USER' and a.sid = s.sid and a.object='SUBSCRIBER_ATTR'order by
s.username, s.osuser;
==========================================================
SQL-30 =====查看回滚段
==========================================================
SQL>col name format a10
SQL>set linesize 100
SQL>select rownum, sys.dba_rollback_segs.segment_name Name, v$rollstat.extents
Extents, v$rollstat.rssize Size_in_Bytes, v$rollstat.xacts XActs, v$rollstat.gets Gets,
v$rollstat.waits Waits, v$rollstat.writes Writes, sys.dba_rollback_segs.status status
from v$rollstat, sys.dba_rollback_segs, v$rollname where v$rollname.name(+) =
sys.dba_rollback_segs.segment_name and v$rollstat.usn (+) = v$rollname.usn order
by rownum;
==========================================================
SQL-31 =====耗资源的进程(top session)
==========================================================
select s.schemaname schema_name,decode(sign(48 - command), 1,
to_char(command), 'Action Code #' || to_char(command) ) action,status
session_status,s.osuser os_user_name,s.sid,p.spid,s.serial#
serial_num,nvl(s.username,'[Oracle process]') user_name,s.terminal
terminal,s.program program,st.value criteria_value from v$sesstat st,v$session
s,v$process p where st.sid = s.sid and st.statistic# = to_number('38') and
('ALL'='ALL' or s.status ='ALL') and p.addr=s.paddr order by st.value desc,p.spid
asc,s.username asc,s.osuser asc;
==========================================================
SQL-32 =====根据PID查找相应的语句
==========================================================
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 cWHERE b.spid=spid
AND b.addr=a.paddr AND a.sql_address=c.address(+) ORDER BY c.piece;
==========================================================
SQL-33 =====监控当前数据库谁在运行什么SQL语句
==========================================================
SQL>SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
==========================================================
SQL-34 =====监控数据库某用户在运行什么SQL
==========================================================
SQL>SELECT SQL_TEXT FROM V$SQLTEXT T, V$SESSION S WHERE
T.ADDRESS=S.SQL_ADDRESS
AND T.HASH_VALUE=S.SQL_HASH_VALUE AND S.MACHINE='XXXXX'
OR USERNAME='WACOS';
==========================================================
SQL-35 =====查询前台正在发出的sql 语句
==========================================================
SQL> select user_name,sql_text from v$open_cursor where sid in(select sid from
(select sid,serial# from v$session where status='ACTIVE'));
==========================================================
SQL-36 =====查询当前所执行的SQL语句
==========================================================
**步骤1 查询SQL执行地址***
SQL> select program ,sql_address from v$session where paddr in (select addr
from v$process where spid=3556);
PROGRAM SQL_ADDRESS
------------------------------------------------ ----------------
sqlplus@ctc20 (TNS V1-V3) 000000038FCB1A90
**步骤2 根据SQL执行的内存地址,查询SQL语句***
SQL> select sql_text from v$sqlarea where address='000000038FCB1A90';
==========================================================
SQL-37 =====监控消耗CPU最高的进程所对应的SQL语句
==========================================================
set line 240
set verify off
column sid format 999
column pid format 999
column S_# format 999
column username format A9 heading "ORA User"
column program format a29
column SQL format a60
COLUMN OSname format a9 Heading "OS User"
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 '%&1%';
Enter value for 1: PID(这里输入占用CPU最高的进程对应的PID)
set termout off
spool maxcpu.txt
SQL>SELECT '++'||S.username
username,RTRIM(REPLACE(a.sql_text,chr(10),''))||';'
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 '%&&1%';
Enter value for 1: PID(这里输入占用CPU最高的进程对应的PID)
spool off(这句放在最后执行)
==========================================================
SQL-38 =====监控CPU使用率最高的2 条SQL语句
==========================================================
执行:top,通过top 获得CPU占用率最高的进程的pid。
SQL>select sql_text,spid,v$session.program,process from
v$sqlarea,v$session,v$process where v$sqlarea.address=v$session.sql_address and
v$sqlarea.hashvalue=v$session.sql_hash_value
and v$session.paddr=v$process.addr and v$process.spid in (pid);
==========================================================
SQL-39 =====查询锁(Lock)情况
==========================================================
SQL>select /*+ RULE */ ls.osuser os_user_name, ls.username user_name,
decode(ls.type,'RW','Row wait enqueue lock','TM','DML enqueue lock',
'TX','Transaction enqueue lock','UL','User supplied lock') lock_type,
o.object_name object,decode(ls.lmode, 1, null, 2,'Row Share', 3,'Row
Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive',null) lock_mode
,o.owner,ls.sid,ls.serial# serial_num,ls.id1,ls.id2
from sys.dba_objects o,(select
s.osuser,s.username,l.type,l.lmode,s.sid,s.serial#,l.id1,l.id2 from v$session s,v$lock l
where s.sid=l.sid) ls
where o.object_id=ls.id1 and o.owner<>'SYS' order by o.owner,
o.object_name;
SQL>select sys.v_$session.osuser,sys.v_$session.machine,v$lock.sid,
sys.v_$session.serial#,
decode(v$lock.type,'MR','Media Recovery','RT','Redo
Thread','UN','User Name','TX', 'Transaction','TM','DML','UL','PL/SQL User
Lock','DX','Distributed Xaction','CF','Control File', 'IS','Instance State','FS','File
Set','IR','Instance Recovery', 'ST','Disk Space Transaction','TS','Temp
Segment','IV','Library Cache Invalida-tion','LS','Log Start or Switch','RW','Row
Wait','SQ','Sequence Number','TE','Extend Table','TT','Temp Table','Unknown')
LockType,
rtrim(object_type)||' '||rtrim(owner)||'.'|| object_name object_name,
decode(lmode, 0, 'None',1, 'Null',2, 'Row-S',3, 'Row-X',4, 'Share', 5,
'S/Row-X',6, 'Exclusive','Unknown') LockMode,decode(request, 0, 'None',1, 'Null',2,
'Row-S',3, 'Row-X', 4, 'Share',5, 'S/Row-X', 6, 'Exclusive', 'Unknown') RequestMode,
ctime, block b
from v$lock, all_objects, sys.v_$session
where v$Lock.sid > 6 and sys.v_$session.sid = v$lock.sid and v$lock.id1 =
all_objects.object_id;
==========================================================
SQL-40 =====DBA监控数据库死锁
==========================================================
col owner for a12
col object_name for a16
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id;
SQL>select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
SQL>Select sql_address from v$session where sid=<sid>;
SQL>Select * from v$sqltext where address=<sql_address>;
SQL>select COMMAND_TYPE,PIECE,sql_text from v$sqltext where
address=(select sql_address from v$session a where sid=18);
SQL>select object_id from v$locked_object;
SQL>select object_name,object_type from dba_objects where object_id='';
select object_id,session_id,locked_mode from v$locked_object;
select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object
t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;
**如果有长期出现的一列,可能是没有释放的锁。我们可以用下面SQL 语句杀
掉长期没有释放非正常的锁***
SQL>alter system kill session 'sid,serial#';
==========================================================
SQL-41 =====查看等待(wait)情况
==========================================================
SQL>SELECT v$waitstat.class,v$waitstat.count count, SUM(v$sysstat.value)
sum_value FROM v$waitstat,v$sysstat WHERE v$sysstat.name IN('db block
gets','consistent gets') group by v$waitstat.class,v$waitstat.count;
==========================================================
SQL-42 =====查看sga 情况
==========================================================
SQL>SELECT NAME, BYTES FROM SYS.V_$SGASTAT ORDER BY NAME
ASC;
==========================================================
SQL-43 =====查看catched object
==========================================================
SQL>SELECT owner,name,db_link,namespace,type,sharable_mem,loads,
executions,locks,pins,kept FROM v$db_object_cache;
==========================================================
SQL-44 =====查看V$SQLAREA
==========================================================
SQL>SELECT
SQL_TEXT,SHARABLE_MEM,PERSISTENT_MEM,RUNTIME_MEM,SORTS,
VERSION_COUNT,LOADED_VERSIONS,OPEN_VERSIONS,USERS_OPENING,
EXECUTIONS,
USERS_EXECUTING,LOADS,FIRST_LOAD_TIME,INVALIDATIONS,PARSE_C
ALLS,DISK_READS,BUFFER_GETS,ROWS_PROCESSED FROM
V$SQLAREA;
==========================================================
SQL-45 =====查看object 分类数量
==========================================================
select decode(o.type#,1,'INDEX',2,'TABLE',3,'CLUSTER',4,'VIEW',5,'SYNONYM',6,
'SEQUENCE','OTHER') object_type , count(*) quantity from sys.obj$ o where
o.type# > 1 group by
decode(o.type#,1,'INDEX',2,'TABLE',3,'CLUSTER' ,4,'VIEW',5,'SYNONYM',6,'SE
QUENCE','OTHER') union select 'COLUMN', count(*) from sys.col$ union select
'DB LINK' , count(*) from all_objects;
==========================================================
SQL-46 =====查看connection 的相关信息
==========================================================
1)查看有哪些用户连接
select s.osuser os_user_name,decode(sign(48 - command),1,to_char(command),
'Action Code #' || to_char(command))action,p.program oracle_process,
status session_status,s.terminal terminal,s.program program,
s.username user_name,s.fixed_table_sequence activity_meter,''query,
0 memory,0 max_memory,0 cpu_usage,s.sid,s.serial# serial_num
from v$session s,v$process p where s.paddr=p.addr and s.type = 'USER'
order by s.username, s.osuser;
2)根据v.sid 查看对应连接的资源占用等情况
select n.name,v.value,n.class,n.statistic#
from v$statname n,v$sesstat v where v.sid=18 and v.statistic# = n.statistic# order by
n.class, n.statistic#;
3)根据sid 查看对应连接正在运行的sql
select /*+ PUSH_SUBQ */ command_type,sql_text,sharable_mem,
persistent_mem,runtime_mem,sorts,version_count,
loaded_versions,open_versions,users_opening,executions,
users_executing,loads,first_load_time,invalidations,
parse_calls,disk_reads,buffer_gets,rows_processed,sysdate start_time,sysdate
finish_time,'>'|| address sql_address,
'N' status from v$sqlarea where address = (select sql_address from v$session where
sid=8);
4)根据pid查看sql 语句:
select sql_text from v$sql
where address in
(select sql_address from v$session
where sid in
(select sid from v$session where paddr in (select addr from v$process where
spid=&pid)));
==========================================================
SQL-47 =====查询有哪些数据库实例在运行
==========================================================
select inst_name from v$active_instances;
==========================================================
SQL-48 =====查看表是否是分区表
==========================================================
select TABLE_NAME,PARTITIONED from user_tables where
TABLE_NAME='LOCALUSAGE';
TABLE_NAME PAR
------------------------------ --- ---------
LOCALUSAGE YES
==========================================================
SQL-49 =====查看分区表的分区名和相应的表空间名
==========================================================
select TABLE_NAME, PARTITION_NAME,TABLESPACE_NAME from
user_tab_partitions where table_name like ‘%USAGE%’;
==========================================================
SQL-50 =====查看索引是否是分区索引
==========================================================
**步骤1 查询是否是分区索引****
SELECT INDEX_NAME, TABLE_NAME, STATUS, PARTITIONED FROM
USER_INDEXESWHERE TABLE_NAME LIKE '%USAGE';
**步骤2 如果返回的PATITIONED为YES,请再执行如下语句来查询分区索引
的类型****
SELECT index_name,table_name,locality FROM user_part_indexes;
==========================================================
SQL-51 =====Dual表的用法,常用在没有目标表的Select 中
==========================================================
**查看系统时间****
select to_char(sysdate,'yy-mm-dd hh24:mi:ss') shijian from dual;
==========================================================
SQL-52 =====查看索引段中extent 的数量
==========================================================
select segment_name,count(*) from dba_extents
where segment_type='INDEX' and owner='SCOTT' group by segment_name;
==========================================================
SQL-53 =====查看系统表空间中的非管理员索引
==========================================================
SQL>select count(*) from dba_indexes where tablespace_name='SYSTEM' and
owner NOT IN('SYS','SYSTEM');
==========================================================
SQL-54 =====查看system 表空间内的索引的扩展情况
==========================================================
SELECT SUBSTR(segment_name,1,20) "SEGMENT NAME",bytes, COUNT(bytes)
FROM dba_extents WHERE segment_name IN( SELECT index_name FROM
dba_indexes
WHERE tablespace_name = 'SYSTEM') GROUP BY segment_name,bytes ORDER
BY segment_name;
==========================================================
SQL-55 =====查看表空间数据文件的读写性能
==========================================================
SQL>Select name,phyrds,phywrts,avgiotim,miniotim,maxiowtm,maxiortm from
v$filestat,v$datafile where v$filestat.file#=v$datafile.file#;
SQL>Select fs.name
name,f.phyrds,f.phyblkrd,f.phywrts,f.phyblkwrt ,f.readtim,f.writetim from v$filestat f,
v$datafile fs where f.file# = fs.file# order by fs.name;
(注意:如果phyblkrd 与phyrds 很接近的话,则表明这个表空间中存在全表扫描
的表,这些表需要调整索引或优化SQL语句)
==========================================================
SQL-56 =====转换表空间为local 方式
==========================================================
SQL> exec sys.dbms_space_admin.tablespace_migrate_to_local('TBS_TEST') ;
==========================================================
SQL-57 =====查看一下哪个用户在用临时段
==========================================================
SELECT username,sid,serial#,sql_address,machine,program,tablespace,segtype,
contents FROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr;
==========================================================
SQL-58 =====查看占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;
==========================================================
SQL-59 =====查找前十条性能差的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-60 =====删除用户下所有表的语句
==========================================================
select 'drop table '||table_name||' cascade constraints;' from user_tables;
==========================================================
SQL-61 =====查看LOCK并杀掉会话
==========================================================
set linesize 132 pagesize 66
break on Kill on username on terminal
column Kill heading 'Kill String' format a13
column res heading 'Resource Type' format 999
column id1 format 9999990
column id2 format 9999990
column lmode beading 'Lock Held' format a20
column request heading 'Lock Requested' format a20
column serial# format 99999
column username format a10 heading "Username"
column terminal heading Term format a6
column tab format a35 heading "table Name"
column owner format a9
column Address format a18
select nvl(S.USERNAME,'Internal') username,
nvl(S.TERMINAL,'None') terminal,
L.SID||','||S.SERIAL# Kill,
U1.NAME||','||substr(T1.NAME,1,20) tab,
decode(L.LMODE, 1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) request
from V$LOCK L,
V$SESSION S,
SYS.USER$ U1,
SYS.OBJ$ T1
where L.SID = S.SID
and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)
and U1.USER#= T1.OWNER#
and S.TYPE != 'BACKGROUND'
order by 1,2,5;
--alter system kill session ' , ';
column username format A15
column sid format 9990 heading SID
column type format A4
column lmode format 990 heading 'HELD'
column request format 990 heading 'REQ'
column id1 format 9999990
column id2 format 9999990
break on id1 skip 1 dup
spool tfslckwt.lst
select sn.username,
m.sid,
m.type,
DECODE(m.lmode,0,'None',
1,'Null',
2,'Row Share',
3,'Row Excl.',
4,'Share',
5,'S/Row Excl.',
6,'Exclusive',
lmode,ltrim(to_char(lmode,'990'))) lmode,
DECODE(m.request,0,'None',
1,'Null',
2,'Row Share',
3,'Row Excl.',
4,'Share',
5,'S/Row Excl.',
6,'Exclusive',
request,ltrim(to_char(m.request,'990'))) request,
m.id1,
m.id2
from v$session sn,
v$lock m
where (sn.sid = m.sid and m.request!= 0)
or (sn.sid = m.sid and
m.request = 0 and lmode != 4 and
(id1 ,id2) in (select s.id1,
s.id2
from v$lock s
where request != 0 and s.id1 = m.id1 and s.id2 = m.id2)
)
order by id1,id2,m.request;
spool off
clear breaks
==========================================================
SQL-62 =====识别IO 竞争和负载平衡
==========================================================
col 文件名format a35
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
/
文件名读次数写次数
读时间写时间
-------------------------------------------- ---------- ---------- ---------- ----------
C:\ORACLE\ORADATA\ORADB\DR01.DBF 885
883 0 0
C:\ORACLE\ORADATA\ORADB\INDX01.DBF 885
883 0 0
C:\ORACLE\ORADATA\ORADB\OEM_REPOSITORY.ORA 885
883 0 0
C:\ORACLE\ORADATA\ORADB\RBS01.DBF 925
22306 0 0
C:\ORACLE\ORADATA\ORADB\SYSTEM01.DBF 50804
155025 0 0
C:\ORACLE\ORADATA\ORADB\TEMP01.DBF 887
894 0 0
C:\ORACLE\ORADATA\ORADB\TOOLS01.DBF 886
892 0 0
C:\ORACLE\ORADATA\ORADB\USERS01.DBF 885
883 0 0
已选择8 行。
其中:ORADB为数据库名,因为本例中数据库使默认安装,没有进行过优化、
调整,所以一直在system 表空间上做操作,导致system 表空间所在的数据文件
SYSTEM01.DBF被读写的次数最多,
这也说明了,尽量不要在system 表空间做与系统无关的操作,应给各个
用户建立单独的表空间。
==========================================================
SQL-63 =====查看哪些session 正在使用哪些回滚段
==========================================================
col 回滚段名format a10
col SID format 9990
col 用户名format a10
col 操作程序format a80
col status format a6 trunc
SELECT r.name 回滚段名, s.sid, s.serial#, s.username 用户名, t.status, t.cr_get,
t.phy_io, t.used_ublk, t.noundo, substr(s.program, 1, 78) 操作程序
FROM sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r
WHERE t.addr = s.taddr and t.xidusn = r.usn ORDER BY t.cr_get,t.phy_io;
==========================================================
SQL-64 =====查看WACOS 表空间下所有的索引
==========================================================
SQL>select 'analyze index '||segment_name||' validate structure;' from dba_segments
where tablespace_name='WACOS'and segment_type='INDEX';
==========================================================
SQL-65 =====查看数据文件的hwm(可以resize的最小空间)和文件头大小
==========================================================
SQL>SELECT v1.file_name,v1.file_id,num1 totle_space,num3
free_space,num1-num3 "USED_SPACE(HWM)",nvl(num2,0)
data_space,num1-num3-nvl(num2,0) file_head
FROM (SELECT file_name,file_id,SUM(bytes) num1 FROM
Dba_Data_Files GROUP BY file_name,file_id) v1,
(SELECT file_id,SUM(bytes) num2 FROM dba_extents GROUP BY
file_id) v2,
(SELECT file_id,SUM(BYTES) num3 FROM DBA_FREE_SPACE
GROUP BY file_id) v3
WHERE v1.file_id=v2.file_id(+) AND v1.file_id=v3.file_id(+);
==========================================================
SQL-66 =====查看数据文件大小及头大小
==========================================================
SQL>SELECT v1.file_name,v1.file_id,
num1 totle_space,
num3 free_space,
num1-num3 Used_space,
nvl(num2,0) data_space,
num1-num3-nvl(num2,0) file_head
FROM
(SELECT file_name,file_id,SUM(bytes) num1 FROM Dba_Data_Files GROUP BY
file_name,file_id) v1,
(SELECT file_id,SUM(bytes) num2 FROM dba_extents GROUP BY file_id) v2,
(SELECT file_id,SUM(BYTES) num3 FROM DBA_FREE_SPACE GROUP BY
file_id) v3
WHERE v1.file_id=v2.file_id(+)
AND v1.file_id=v3.file_id(+);
(运行以上查询,我们可以如下信息:
Totle_pace:该数据文件的总大小,字节为单位
Free_space:该数据文件的剩于大小,字节为单位
Used_space:该数据文件的已用空间,字节为单位
Data_space:该数据文件中段数据占用空间,也就是数据空间,字节为单位
File_Head:该数据文件头部占用空间,字节为单位)
数据库各个表空间增长情况的检查:
SQL>select A.tablespace_name,(1-(A.total)/B.total)*100 used_percent
From (select tablespace_name,sum(bytes) total from dba_free_space group by
tablespace_name) A,(select tablespace_name,sum(bytes) total from dba_data_files
group by tablespace_name) B where A.tablespace_name=B.tablespace_name;
SQL>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;
查看各个表空间占用磁盘情况:
SQL>col tablespace_name format a20;
SQL>select b.file_id file_ID,
b.tablespace_name tablespace_name,
b.bytes Bytes,
(b.bytes-sum(nvl(a.bytes,0))) used,
sum(nvl(a.bytes,0)) free,
sum(nvl(a.bytes,0))/(b.bytes)*100 Percent
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id;
数据库对象下一扩展与表空间的free扩展值的检查:
SQL>select a.table_name, a.next_extent, a.tablespace_name
from all_tables a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name =
a.tablespace_name and a.next_extent > f.big_chunk
union select a.index_name, a.next_extent, a.tablespace_name
from all_indexes a,(select tablespace_name, max(bytes) as big_chunk
from dba_free_space group by tablespace_name ) f where f.tablespace_name =
a.tablespace_name and a.next_extent > f.big_chunk;
Disk Read 最高的SQL语句的获取:
SQL>select sql_text from (select * from v$sqlarea order by disk_reads)
where rownum<=5;
查找前十条性能差的sql:
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 ;
等待时间最多的5 个系统等待事件的获取:
SQL>select * from (select * from v$system_event where event not like 'SQL%' order
by total_waits desc) where rownum<=5;
查看当前等待事件的会话:
SQL>col username format a10
SQL>set line 120
SQL>col EVENT format a30
SQL>select
SE.Sid,s.Username,SE.Event,se.Total_Waits,SE.Time_Waited,SE.Average_Wait
from v$session S,v$session_event SE where S.Username is not null and SE.Sid=S.Sid
and S.Status='ACTIVE' and SE.Event not like '%SQL*Net%';
SQL>select sid, event, p1, p2, p3, wait_time, seconds_in_wait, state from
v$session_wait where event not like '%message%' and event not like 'SQL*Net%' and
event not like '%timer%' and event != 'wakeup time manager';
找到与所连接的会话有关的当前等待事件:
SQL>select
SW.Sid,S.Username,SW.Event,SW.Wait_Time,SW.State,SW.Seconds_In_Wait
SEC_IN_WAIT
from v$session S,v$session_wait SW where S.Username is not null and
SW.Sid=S.Sid
and SW.event not like '%SQL*Net%' order by SW.Wait_Time Desc;
Oracle所有回滚段状态的检查:
SQL>select
segment_name,owner,tablespace_name,initial_extent,next_extent,dba_rollback_segs.s
tatus from dba_rollback_segs,v$datafile where file_id=file#;
Oracle回滚段扩展信息的检查:
SQL>col name format a10
SQL>set linesize 140
SQL>select substr(name,1,40)
name,extents,rssize,optsize,aveactive,extends,wraps,shrinks,hwmsize
from v$rollname rn,v$rollstat rs where (rn.usn=rs.usn);
extents:回滚段中的盘区数量。
Rssize:以字节为单位的回滚段的尺寸。
optsize:为optimal 参数设定的值。
Aveactive:从回滚段中删除盘区时释放的以字节为单位的平均空间的大小。
Extends:系统为回滚段增加的盘区的次数。
Shrinks:系统从回滚段中清除盘区(即回滚段收缩)的次数。回滚段每次清除盘
区时,系统可能会从这个回滚段中消除一个或多个盘区。
Hwmsize:回滚段尺寸的上限,即回滚段曾经达到的最大尺寸。
(如果回滚段平均尺寸接近OPTIMAL的值,那么说明OPTIMAL的值设置正确,
如果回滚段动态增长次数或收缩次数很高,那么需要提高OPTIMAL的值)
查看回滚段的使用情况,哪个用户正在使用回滚段的资源:
SQL>select s.username, u.name from v$transaction t,v$rollstat r,
v$rollname u,v$session s where s.taddr=t.addr and
t.xidusn=r.usn and r.usn=u.usn order by s.username;
如何查看一下某个shared_server正在忙什么:
SQL>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=13161 AND b.addr=a.paddr
AND a.sql_address=c.address(+) ORDER BY c.piece;
数据库共享池性能检查:
SQL>Select namespace,gets,gethitratio,pins,pinhitratio,reloads,
Invalidations from v$librarycache where namespace in
('SQLAREA','TABLE/PROCEDURE','BODY','TRIGGER');
检查数据重载比率:
SQL>select sum(reloads)/sum(pins)*100 "reload ratio" from
v$librarycache;
检查数据字典的命中率:
SQL>select 1-sum(getmisses)/sum(gets) "data dictionary hit
ratio" from v$rowcache;
(对于library cache, gethitratio 和pinhitratio 应该大于90%,对于数据重载比
率,reload ratio应该小于1%,对于数据字典的命中率,data dictionary hit ratio应该大
于85%)
检查共享内存的剩余情况:
SQL>select request_misses, request_failures from v$shared_pool_reserved;
(对于共享内存的剩余情况, request_misses 和request_failures 应该接近0)
数据高速缓冲区性能检查:
SQL>select 1-p.value/(b.value+c.value) "db buffer cache hit
ratio" from v$sysstat p,v$sysstat b,v$sysstat c where
p.name='physical reads' and b.name='db block gets' and
c.name='consistent gets';
检查 buffer pool HIT_RATIO执行
SQL>select name, (physical_reads/(db_block_gets+consistent_gets))
"MISS_HIT_RATIO" FROM v$buffer_pool_statistics WHERE (db_block_gets+
consistent_gets)> 0;
( 正常时db buffer cache hit ratio 应该大于90%, 正常时buffer pool
MISS_HIT_RATIO 应该小于10%)
数据库回滚段性能检查:
检查Ratio执行
SQL>select sum(waits)* 100 /sum(gets) "Ratio", sum(waits)
"Waits", sum(gets) "Gets" from v$rollstat;
检查count/value执行:
SQL>select class,count from v$waitstat where class like '%undo%';
SQL>select value from v$sysstat where name='consistent gets';
(两者的value值相除)
检查 average_wait 执行:
SQL>select event,total_waits,time_waited,average_wait from v$system_event
where event like '%undo%';
检查 RBS header get ratio执行:
SQL>select n.name,s.usn,s.wraps, decode(s.waits,0,1,1- s.waits/s.gets)"RBS
header get ratio" from v$rollstat s,v$rollname n where s.usn=n.usn;
(正常时Ratio 应该小于1%, count/value应该小于0.01%,average_wait最好为0,
该值越小越好,RBS header get ratio 应该大于95%)
杀会话的脚本:
SQL>select
A.SID,B.SPID,A.SERIAL#,a.lockwait,A.USERNAME,A.OSUSER,a.logon_time,a.la
st_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;
查看排序段的性能:
SQL>SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)',
'sorts (disk)');
查看数据表的参数信息:
SQL>SELECT partition_name, high_value, high_value_length,
tablespace_name,pct_free, pct_used, ini_trans, max_trans, initial_extent,next_extent,
min_extent, max_extent, pct_increase, FREELISTS,freelist_groups, LOGGING,
BUFFER_POOL, num_rows, blocks,empty_blocks, avg_space, chain_cnt,
avg_row_len, sample_size,last_analyzed FROM dba_tab_partitions
--WHERE table_name = :tname AND table_owner = :towner
ORDER BY partition_position;
2)根据v.sid 查看对应连接的资源占用等情况
select n.name,v.value,n.class,n.statistic#
from v$statname n,v$sesstat v where v.sid=18 and v.statistic# = n.statistic# order by
n.class, n.statistic#;
3)根据sid 查看对应连接正在运行的sql
select /*+ PUSH_SUBQ */ command_type,sql_text,sharable_mem,
persistent_mem,runtime_mem,sorts,version_count,
loaded_versions,open_versions,users_opening,executions,
users_executing,loads,first_load_time,invalidations,
parse_calls,disk_reads,buffer_gets,rows_processed,sysdate start_time,sysdate
finish_time,'>'|| address sql_address,
'N' status from v$sqlarea where address = (select sql_address from v$session where
sid=8);
根据pid查看sql 语句:
SQL>select sql_text from v$sql
where address in
(select sql_address from v$session
where sid in
(select sid from v$session where paddr in (select addr from v$process where
spid=&pid)));
oracle数据库性能监控的SQL
监控事例的等待
SQL>select event,sum(decode(wait_Time,0,0,1))
"Prev",sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot" from v$session_Wait
group by event order by 4;
回滚段的争用情况
SQL>select name, waits, gets, waits/gets "Ratio" from v$rollstat a, v$rollname b
where a.usn = b.usn;
监控表空间的 I/O 比例
SQL>select df.tablespace_name name,df.file_name "file",f.phyrds pyr,
f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw from v$filestat f, dba_data_files df
where f.file# = df.file_id
order by df.tablespace_name;
监控文件系统的I/O 比例
SQL>select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",
a.status,a.bytes,b.phyrds,b.phywrts from v$datafile a, v$filestat b
where a.file# = b.file#;
在某个用户下找所有的索引
SQL>select user_indexes.table_name, user_indexes.index_name,uniqueness,
column_name from user_ind_columns, user_indexes where
user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
监控SGA 的命中率
SQL>select a.value + b.value "logical_reads", c.value "phys_reads",
round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c where a.statistic# = 38 and b.statistic# = 39
and c.statistic# = 40;
监控 SGA 中字典缓冲区的命中率
SQL>select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss
ratio",(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from
v$rowcache where gets+getmisses <>0 group by parameter, gets, getmisses;
监控 SGA 中共享缓存区的命中率,应该小于1%
SQL>select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache from v$librarycache;
SQL>select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins)
"reload percent" from v$librarycache;
显示所有数据库对象的类别和大小
SQL>select count(name) num_instances ,type ,sum(source_size)
source_size,sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size)
error_size,sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size)
size_required from dba_object_size group by type order by 2;
监控SGA 中重做日志缓存区的命中率,应该小于1%
SQL>SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latchWHERE name IN ('redo allocation', 'redo copy');
监控内存和硬盘的排序比率,最好使它小于.10,增加sort_area_size
SQL>SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)',
'sorts (disk)');
监控当前数据库谁在运行什么SQL语句
SQL>SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
监控字典缓冲区
SQL>SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM
V$LIBRARYCACHE;
SQL>SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS)
"ROW CACHE" FROM V$ROWCACHE;
SQL>SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES
WHILE EXECUTING" FROM V$LIBRARYCACHE;(后者除以前者,此比率小于
1%,接近0%为好)
SQL>SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES)
"DICTIONARY CACHE GET MISSES" FROM V$ROWCACHE;
查找ORACLE 字符集
SQL>select * from sys.props$ where name='NLS_CHARACTERSET';
监控 MTS
SQL>select busy/(busy+idle) "shared servers busy" from v$dispatcher;
(此值大于0.5 时,参数需加大)
SQL>select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where
type='dispatcher';
SQL>select count(*) from v$dispatcher;
SQL>select servers_highwater from v$mts;
(servers_highwater 接近mts_max_servers 时,参数需加大)
碎片程度
SQL>select tablespace_name,count(tablespace_name) from dba_free_space group by
tablespace_name having count(tablespace_name)>10;
SQL>alter tablespace name coalesce;
SQL>alter table name deallocate unused;
SQL>create or replace view ts_blocks_v as
select tablespace_name,block_id,bytes,blocks,'free space' segment_name from
dba_free_space
union all
select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;
select * from ts_blocks_v;
SQL>select tablespace_name,sum(bytes),max(bytes),count(block_id) from
dba_free_space group by tablespace_name;
查看碎片程度高的表
SQL>SELECT segment_name table_name,COUNT(*) extents
FROM dba_segmentsWHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY
segment_name HAVING COUNT(*)=(SELECT MAX(COUNT(*)) FROM
dba_segments GROUP BY segment_name);
17. 表、索引的存储情况检查
SQL>select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='&tablespace_name' and segment_type='TABLE' group by
tablespace_name,segment_name;
SQL>select segment_name,count(*) from dba_extents where segment_type='INDEX'
and owner='&owner' group by segment_name;
18、找使用CPU多的用户session
SQL>select a.sid,spid,status,substr(a.program,1,40)
prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;
(12 是cpu used by this session)
表空间统计
A、脚本说明:
这是我最常用的一个脚本,用它可以显示出数据库中所有表空间的状态,如表空
间的大小、已使用空间、使用的百分比、空闲空间数及现在表空间的最大块是多
大。
B、脚本原文:
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;
查看无法扩展的段
A、脚本说明:
ORACLE 对一个段比如表段或索引无法扩展时,取决的并不是表空间中剩余的
空间是多少,而是取于这些剩余空间中最大的块是否够表比索引的“NEXT”值
大,所以有时一个表空间剩余几个G的空闲空间,在你使用时ORACLE 还是提
示某个表或索引无法扩展,就是由于这一点,这时说明空间的碎片太多了。这个
脚本是找出无法扩展的段的一些信息。
B、脚本原文:
SELECT segment_name,
segment_type,
owner,
a.tablespace_name "tablespacename",
initial_extent/1024 "inital_extent(K)",
next_extent/1024 "next_extent(K)",
pct_increase,
b.bytes/1024 "tablespace max free space(K)",
b.sum_bytes/1024 "tablespace total free space(K)"
FROM dba_segments a,
(SELECT tablespace_name,MAX(bytes) bytes,SUM(bytes) sum_bytes
FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name=b.tablespace_name
AND next_extent>b.bytes
ORDER BY 4,3,1;
查看段(表段、索引段)所使用空间的大小
A、脚本说明:
有时你可能想知道一个表或一个索引占用多少M 的空间,这个脚本就是满足你
的要求的,把<>中的内容替换一下就可以了。
B、脚本原文:
SELECT owner,
segment_name,
SUM(bytes)/1024/1024
FROM dba_segments
WHERE owner=
And segment_name=
GROUP BY owner,segment_name
ORDER BY 3 DESC;
查看数据库中的表锁
A、脚本说明:
这方面的语句的样式是很多的,各式一样,不过我认为这个是最实用的,不信
你就用一下,无需多说,锁是每个DBA一定都涉及过的内容,当你相知道某个
表被哪个session 锁定了,你就用到了这个脚本。
B、脚本原文:
SELECTA.OWNER,
A.OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME,
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE,
C.STATUS,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM
FROMALL_OBJECTS A,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
-- AND
ORDER BY 1,2;
处理存储过程被锁
A、脚本说明:
实际过程中可能你要重新编译某个存储过程理总是处于等待状态,最后会报
无法锁定对象,这时你就可以用这个脚本找到锁定过程的那个sid,需要注意的
是查v$access 这个视图本来就很慢,需要一些耐心。
B、脚本原文:
SELECT * FROM V$ACCESS WHERE owner=<object owner> And
object=<procedure name>;

 

 

http://czmmiao.iteye.com/blog/1292412

 

database 概况信息检查 
# 检查 database 基本信息 
select * from v$version; 
select name ,open_mode,log_mode from v$database; 
select instance_number,instance_name ,status from gv$instance; 
show parameter cpu_count 
show parameter block_size 
select group#,thread#,members,bytes/1024/1024 from gv$log; 
show sga 
select count(*) from v$controlfile 
select count(*) from v$tempfile; 
select count(*) from v$datafile;

查看数据文件信息 
# 检查表空间数据文件信息 
col tablespace_name for a30 
select tablespace_name , sum(bytes)/1024/1024 from dba_temp_files group by tablespace_name; 

# 检查表空间 
SELECT 
TABLESPACE_NAME,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE 
_MANAGEMENT FROM DBA_TABLESPACES; 

# 检查数据文件状态 
select count(*),status from v$datafile group by status;
# 检查表空间使用情况 
select 
f.tablespace_name, 
a.total, 
f.free,(a.total-f.free)/1024 "used SIZE(G)" 
,round((f.free/a.total)*100) "% Free" 
from 
(select tablespace_name, sum(bytes/(1024*1024)) total from dba_data_files group by 
tablespace_name) a, 
(select tablespace_name, round(sum(bytes/(1024*1024))) free from dba_free_space 
group by tablespace_name) f 
WHERE a.tablespace_name = f.tablespace_name(+) 
order by "% Free" 

# 查询临时 segment 使用情况 
COL username FORMAT a10; 
COL segtype FORMAT a10; 
SELECT username, segtype, extents "Extents Allocated" 
,blocks "Blocks Allocated" 
FROM v$tempseg_usage; 

# 查看临时表空间大小
select tablespace_name,file_name,bytes/1024/1024 "file_size(M)",autoextensible from dba_temp_files;
select status,enabled, name, bytes/1024/1024 file_size from v$tempfile;
# 查看临时表空间的使用情况 
SELECT temp_used.tablespace_name,
           total - used as "Free",
           total as "Total",
           round(nvl(total - used, 0) * 100 / total, 3) "Free percent"
      FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 used
              FROM GV_$TEMP_SPACE_HEADER
             GROUP BY tablespace_name) temp_used,
           (SELECT tablespace_name, SUM(bytes) / 1024 / 1024 total
              FROM dba_temp_files
             GROUP BY tablespace_name) temp_total
     WHERE temp_used.tablespace_name = temp_total.tablespace_name
# 查找消耗较多临时表空间的sql 
Select se.username,
         se.sid,
         su.extents,
         su.blocks * to_number(rtrim(p.value)) as Space,
         tablespace,
         segtype,
         sql_text
    from v$sort_usage su, v$parameter p, v$session se, v$sql s
   where p.name = 'db_block_size'
     and su.session_addr = se.saddr
     and s.hash_value = su.sqlhash
     and s.address = su.sqladdr
   order by se.username, se.sid

# 查看当前临时表空间使用大小与正在占用临时表空间的sql语句 
select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
    from v$sort_usage sort, v$session sess, v$sql sql
   where sort.SESSION_ADDR = sess.SADDR
     and sql.ADDRESS = sess.SQL_ADDRESS
   order by blocks desc;
 
# 查看数据文件信息 , 若文件较多可以根据需要字段进行排序 输出 top 10

col datafile for a60 
SELECT fs.phyrds "Reads", fs.phywrts "Writes" 
,fs.avgiotim "Average I/O Time", df.name "Datafile" 
FROM v$datafile df, v$filestat fs WHERE df.file# = fs.file#; 

# 查看所有数据文件 i/ o 情况 , 若文件太多 , 可以改写 为 top 10 select *( order by xx desc) where 
rownum<=10。其中phyrds为物理读的次数极为Reads,phywrts为物理写的次数极为Writes,phyblkrd为物理块读的次数即为br,phyblkwrt为物理写的次数即为bw。readtime为耗费在物理读上的总时间极为RTime,writetim为耗费在物理写上的总时间即为WTime。这两个值只有在参数timed_statistics参数为true时才有效。
COL ts FORMAT a10 HEADING "Tablespace"; 
COL reads FORMAT 999990; 
COL writes FORMAT 999990; 
COL br FORMAT 999990 HEADING "BlksRead"; 
COL bw FORMAT 999990 HEADING "BlksWrite"; 
COL rtime FORMAT 999990; 
COL wtime FORMAT 999990; 
SELECT ts.name AS ts, fs.phyrds "Reads", fs.phywrts "Writes" 
,fs.phyblkrd AS br, fs.phyblkwrt AS bw 
,fs.readtim "RTime", fs.writetim "WTime" 
FROM v$tablespace ts, v$datafile df, v$filestat fs 
WHERE ts.ts# = df.ts# AND df.file# = fs.file#
 
UNION 
SELECT ts.name AS ts, ts.phyrds "Reads", ts.phywrts "Writes",ts.phyblkrd AS br, ts.phyblkwrt AS bw 
,ts.readtim "RTime", ts.writetim "WTime" 
FROM v$tablespace ts, v$tempfile tf, v$tempstat ts 
WHERE ts.ts# = tf.ts# AND tf.file# = ts.file# ORDER BY 1; 

# 获取 top 10 热 segment

set linesize 180
col object_name for a40 
select * from 
(select 
ob.owner, ob.object_name, sum(b.tch) Touchs 
from x$bh b , dba_objects ob 
where b.obj = ob.data_object_id 
and b.ts# > 0 
group by ob.owner, ob.object_name 
order by sum(tch) desc) 
where rownum <=10 

# 判断物理读最多的 object

select * from (select owner,object_name,value from v$segment_statistics where 
statistic_name='physical reads' order by value desc) where rownum<=10 

# 查看热点数据文件 ( 从单块读取时间判断 )

col FILE_NAME for a60
set linesize 180
SELECT t.file_name, 
t.tablespace_name, 
round(s.singleblkrdtim/s.singleblkrds, 2) AS CS, 
s.READTIM, 
s.WRITETIM 
FROM v$filestat s, dba_data_files t 
WHERE s.file# = t.file_id and 
s.singleblkrds <>0 and rownum<=10 order by cs desc 
#估算表空间大小

select a.tablespace_name,

        round(a.s,2) "CURRENT_TOTAL(MB)" ,

        round((a.s - f.s),2) "USED(MB)" ,

        f.s "FREE(MB)" ,

        round(f.s / a.s * 100, 2) "FREE%" ,

        g.autoextensible,

        round(a.ms,2) "MAX_TOTAL(MB)"

   from ( select d.tablespace_name,

                sum (bytes / 1024 / 1024) s,

                sum (decode(maxbytes, 0, bytes, maxbytes) / 1024 / 1024) ms

           from dba_data_files d

          group by d.tablespace_name) a,

        ( select f.tablespace_name, sum (f.bytes / 1024 / 1024) s

           from dba_free_space f

          group by f.tablespace_name) f,

        ( select distinct tablespace_name, autoextensible

           from DBA_DATA_FILES

          where autoextensible = 'YES'

         union

         select distinct tablespace_name, autoextensible

           from DBA_DATA_FILES

          where autoextensible = 'NO'

            and tablespace_name not in

                ( select distinct tablespace_name

                   from DBA_DATA_FILES

                  where autoextensible = 'YES' )) g

  where a.tablespace_name = f.tablespace_name

    and g.tablespace_name = f.tablespace_name order by "FREE%" ;

#精确计算表空间大小,消耗系统资源,慎用
SELECT F.TABLESPACE_NAME,
        A.ALL_TOTAL "总空间" ,
        A.ALL_USED "总使用空间" ,
        A.ALL_TOTAL - A.ALL_USED "总剩余空间" ,
        (A.ALL_TOTAL - A.ALL_USED) / A.ALL_TOTAL * 100 "总剩余比例" ,
        A.TOTAL "当前大小" ,
        U.USED "当前使用空间" ,
        F. FREE "当前剩余空间" ,
        (U.USED / A.TOTAL) * 100 "当前使用比例" ,
        (F. FREE / A.TOTAL) * 100 "当前剩余比例"
   FROM ( SELECT TABLESPACE_NAME,
                SUM (BYTES / (1024 * 1024 * 1024)) TOTAL,
                SUM (DECODE(AUTOEXTENSIBLE, 'YES' , MAXBYTES, BYTES) /
                    (1024 * 1024 * 1024)) ALL_TOTAL,
                SUM (USER_BYTES) / (1024 * 1024 * 1024) ALL_USED
           FROM DBA_DATA_FILES
          GROUP BY TABLESPACE_NAME) A,
        ( SELECT TABLESPACE_NAME, SUM (BYTES / (1024 * 1024 * 1024)) USED
           FROM DBA_EXTENTS
          GROUP BY TABLESPACE_NAME) U,
        ( SELECT TABLESPACE_NAME, SUM (BYTES / (1024 * 1024 * 1024)) FREE
           FROM DBA_FREE_SPACE
          GROUP BY TABLESPACE_NAME) F
  WHERE A.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
    AND A.TABLESPACE_NAME = U.TABLESPACE_NAME(+)
  ORDER BY (A.ALL_TOTAL - A.ALL_USED) / A.ALL_TOTAL,F. FREE / A.TOTAL ASC ;

查看redo

# 检查日志切换频率 
select sequence#,to_char(first_time,'yyyymmdd_hh24:mi:ss') 
firsttime,round((first_time-lag(first_time) over(order by first_time))*24*60,2) minutes from 
v$log_history where first_time > sysdate - 1 order by first_time ,minutes; 

# 检查 lgwr i/o 性能 (time_waited/total_waits:表示平均lgwr写入完成时间若>1表示写入过慢 ) 
select total_waits,time_waited,average_wait,time_waited/total_waits as avg from 
v$system_event where event = 'log file parallel write'; 

# 查询 redo block size

select max(lebsz) from x$kccle;  
# 查看 user commit 次数 
select to_number(value,99999999999) from v$sysstat where name='user commits'; 
# 查看系统运行时间 
select (sysdate - startup_time)*24*60*60 as seconds from v$instance 
# 计算出每秒用户提交次数 
select user_commit 次数 / 系统运行时间 from dual; 
# 计算出每个事务平均处理多少个 redo block 
select value from v$sysstat where name = 'redo blocks written'; 
select a.redoblocks/b.trancount from (select value redoblocks from v$sysstat where name='redo 
blocks written') a ,(select value trancount from v$sysstat where name='user commits') b 

# 计算每天产生了多少日志
SELECT TO_CHAR (TRUNC (COMPLETION_TIME), 'yyyy-mm-dd') "日期",
         SUM (blocks * BLOCK_SIZE) / 1024 / 1024 / 1024 "日志量(G)"
    FROM V$ARCHIVED_LOG
   WHERE dest_id = 1
GROUP BY TRUNC (COMPLETION_TIME)
ORDER BY TRUNC (COMPLETION_TIME) DESC;
 
sga,pga, 命中率 
# sga,pga, 命中率 
# 检查 sga 
show sga 
select * from v$sga; 

# 查看buffer cache设置建议 
select size_for_estimate, estd_physical_read_factor, 
to_char(estd_physical_reads,99999999999999999999999) as"estd_physical_reads" from 
v$db_cache_advice where name = 'DEFAULT'; 
COL pool FORMAT a10; 
SELECT (SELECT ROUND(value/1024/1024,0) FROM v$parameter 
WHERE name = 'db_cache_size') "Current Cache(Mb)" 
,name "Pool", size_for_estimate "Projected Cache(Mb)" 
,ROUND(100-estd_physical_read_factor,0) "Cache Hit Ratio%" 
FROM v$db_cache_advice 
WHERE block_size = (SELECT value FROM v$parameter 
WHERE name = 'db_block_size') 
ORDER BY 3; 

# 查看 cache 池 
show parameter cache 
# 查看 buffer cache 中 defalut pool 命中率 
select name,1-(physical_reads)/(consistent_gets+db_block_gets) 
from v$buffer_pool_statistics; 

# 检查 shared pool 
show parameter shared 
# 检查 shared pool 中 library cache
select namespace,pinhitratio from v$librarycache; 
# 检查整体命中率 (library cache) 
select sum(pinhits)/sum(pins) from v$librarycache; 
select sum(pins) "hits", 
sum(reloads) "misses", 
sum(pins)/(sum(pins)+sum(reloads)) "Hits Ratio" 
from v$librarycache; 

# 检查 shared pool free space 
SELECT * FROM V$SGASTAT 
WHERE NAME = 'free memory' 
AND POOL = 'shared pool'; 

# 每个子shared pool 由单独的 shared pool latch保护,查看他们的命中率 shared pool latch,用于shared pool空间回收分配使用的latch 
col name format a15 
select addr,name,gets,misses,1-misses/gets from v$latch_children where name='shared pool'; 

# 使用 v$shared_pool_advice 计算不同 shared pool 大小情况下,响应时间, S 单位 
SELECT 'Shared Pool' component, 
shared_pool_size_for_estimate estd_sp_size, 
estd_lc_time_saved_factor parse_time_factor, 
CASE 
WHEN current_parse_time_elapsed_s + adjustment_s < 0 THEN 

ELSE 
current_parse_time_elapsed_s + adjustment_s 
END response_time 
FROM (SELECT shared_pool_size_for_estimate, 
shared_pool_size_factor, 
estd_lc_time_saved_factor, 
a.estd_lc_time_saved, 
e.VALUE / 100 current_parse_time_elapsed_s, 
c.estd_lc_time_saved - a.estd_lc_time_saved adjustment_s FROM v$shared_pool_advice a, 
(SELECT * FROM v$sysstat WHERE NAME = 'parse time elapsed') e, 
(SELECT estd_lc_time_saved FROM v$shared_pool_advice 
WHERE shared_pool_size_factor = 1) c) 

# 查看 shared pool 中 各种类型的 chunk 的大小数量 
SELECT KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ) SIZ, 
To_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),'999,999.00')||'k' "AVG 
SIzE" 
FROM X$KSMSP GROUP BY KSMCHCLS; 

# 查看是否有库缓冲有关的等待事件 
select sid,seq#,event,p1,p1raw,p2,p2raw,p3,p3raw,state from v$session_wait where event like 
'library%'; 

# 查询 sga 中各个 pool 情况 
COL name FORMAT a32; 
SELECT pool, name, bytes FROM v$sgastat 
WHERE pool IS NULL 
OR pool != 'shared pool' OR (pool = 'shared pool' 
AND (name IN('dictionary cache','enqueue','library 
cache','parameters', 
'processes','sessions','free memory'))) 
ORDER BY pool DESC NULLS FIRST, name; 
SELECT * FROM V$SGAINFO; 

# 查看使用 shard_pool 保留池情况 
SELECT request_misses, request_failures, free_space 
FROM v$shared_pool_reserved; 

Oracle 专门从共享池内置出一块区域来来分配内存保持这些大块。这个保留共享池的默认大小是共享池的5%(_shared_pool_reserved_pct 5 控制 ) oracle 建设置为 10% 。大小通过参数 SHARED_POOL_RESERVED_SIZE 改。它是从共享池中分配,不是直接从 SGA 中分配的,它是共享池的保留部分,专门用于存储大块段#shared pool 中内存大于 _SHARED_POOL_RESERVED_MIN_ALLOC 将放入 shared pool 保留池 , 保留池维护一个单独的 freelist,lru ,并且不会在 lru 列表存recreatable 类型 chunks ,普通 shared pool 的释放与 shared pool 保留池无关。 
# 关于设置 SHARED_POOL_RESERVED_SIZE 
#1.如果系统出现ora-04031, 发现请求内存都是大于 _SHARED_POOL_RESERVED_MIN_ALLOC (default 10GR2 4400) , 且v$shared_pool_reserved 中有大量 REQUEST_MISSES( 并且可以看下LAST_MISS_SIZE )表示 SHARED_POOL_RESERVED_SIZE 太小了需要大的内存的请求失败 , 那么需要加大SHARED_POOL_RESERVED_SIZE 
#2. 如果 ora-04031 请求内存出现在 4100-4400 并造成 shared pool lru 合并 , 老化换出内存 , 可以调小 _SHARED_POOL_RESERVED_MIN_ALLOC 让此部分内存进入shared reserved pool, 相应的加大SHARED_POOL_RESERVED_SIZE 
#3. 从 v$shared_pool_reserved 来判断 , 如果 REQUEST_FAILURES>0( 出现过 ora-04031) 且LAST_FAILURE_SIZE( 最后请求内存大小 )>_SHARED_POOL_RESERVED_MIN_ALLOC表示 shared reserved pool 缺少连续内存 , 可以加大 SHARED_POOL_RESERVED_SIZE, 减少 _SHARED_POOL_RESERVED_MIN_ALLOC 少放对象 , 并相对加大 shared_pool_size 
# 要是反过来 REQUEST_FAILURES>0( 出现过 ora-04031) 且 LAST_FAILURE_SIZE( 最后请求内存大小)<_SHARED_POOL_RESERVED_MIN_ALLOC, 表示 在 shared pool 中缺少连续内存 , 可以加减少_SHARED_POOL_RESERVED_MIN_ALLOC 多放入一些对象 , 减少 sharedpool 压力 , 适当加大shared_pool_size,SHARED_POOL_RESERVED_SIZE 
# 查询还保留在 library cache 中,解析次数和执行次数最多的 sql( 解析 * 执行 ) 
COL sql_text FORMAT A38; 
SELECT * FROM( 
SELECT parse_calls*executions "Product", parse_calls 
"Parses" 
,executions "Execs", sql_text FROM v$sqlarea ORDER BY 1 DESC) 
WHERE ROWNUM <= 10; 

# 查看 pga 
show parameters area_size 
SELECT * FROM v$pgastat; 
# 查看pga建议

SELECT (SELECT ROUND(value/1024/1024,0) FROM v$parameter
WHERE name = 'pga_aggregate_target') "Current Mb"
, ROUND(pga_target_for_estimate/1024/1024,0) "Projected Mb"
, ROUND(estd_pga_cache_hit_percentage) "%"
FROM v$pga_target_advice
ORDER BY 2;
 
# 查看数据库 cache 或 keep 了哪些 object
COL table_name FORMAT A16 
COL index_name FORMAT A16 
SELECT table_name AS "Table", NULL, buffer_pool, cache FROM 
user_tables 
WHERE buffer_pool != 'DEFAULT' OR TRIM(cache)='Y' 
UNION 
SELECT table_name, index_name, NULL, buffer_pool FROM 
user_indexes 
WHERE buffer_pool != 'DEFAULT' 
ORDER BY 1, 2 NULLS FIRST; 

# 取消 cache 或 keep(keep pool) 
ALTER TABLE XX NOCACHE; 
SELECT 'ALTER INDEX '||index_name||' STORAGE(BUFFER_POOL DEFAULT);' 
FROM USER_INDEXES WHERE BUFFER_POOL!='DEFAULT'; 

检查undo 
show parameter undo_ 
# 检查 undo rollback segment 使用情况 
select name ,rssize,extents,latch,xacts,writes,gets,waits from v$rollstat a,v$rollname b where 
a.usn=b.usn order by waits desc; 
select a.redoblocks/b.trancount from (select value redoblocks from v$sysstat where name='redo 
blocks written') a ,(select value trancount from v$sysstat where name='user commits') b; 

# 计算每秒钟产生的 undoblk 数量 
select sum(undoblks)/sum((end_time-begin_time)*24*60*60) from v$undostat; 
#Undospace=UR*UPS*blocksize + overload(10%), 计算 undo tablespace 大小 
show parameter block_size 
show parameter undo_retention 

# 计算undo表空间大小 
#select undo_retention* 每 秒 产 生 undoblk 数 量 *block_size/1024/1024/1024+ 
(1+1undo_retention* 每秒产生 undoblk 数量 *block_size/1024/1024/1024*0.1) from dual;
 
# 查询 undo 具体信息 
COL undob FORMAT 99990; 
COL trans FORMAT 99990; 
COL snapshot2old FORMAT 9999999990; 
SELECT undoblks "UndoB", txncount "Trans" 
,maxquerylen "LongestQuery", maxconcurrency "MaxConcurrency" 
,ssolderrcnt "Snapshot2Old", nospaceerrcnt "FreeSpaceWait" 
FROM v$undostat; 

# 在内存中排序比率 ( 最优排序 ) 
SELECT 'Sorts in Memory ' "Ratio" 
, ROUND( 
(SELECT SUM(value) FROM V$SYSSTAT WHERE name = 'sorts (memory)') 
/ (SELECT SUM(value) FROM V$SYSSTAT 
WHERE name IN ('sorts (memory)', 'sorts (disk)')) * 100, 5) 
||'%' "Percentage" 
FROM DUAL; 

# 查看当前系统undo使用情况

SELECT DISTINCT STATUS "状态",
                COUNT(*) "EXTENT数量",
                SUM(BYTES) / 1024 / 1024 / 1024 "UNDO大小"
  FROM DBA_UNDO_EXTENTS
 GROUP BY STATUS;

# 查看当前系统和undo相关的会话

SELECT r.NAME 回滚段名,s.sid SID,s.serial# Serial,
s.username 用户名,s.machine 机器名,
t.start_time 开始时间,t.status 状态,
t.used_ublk 撤消块,USED_UREC 撤消记录,
t.cr_get 一致性取,t.cr_change 一致性变化,
t.log_io "逻辑I/O",t.phy_io "物理I/O",
t.noundo NoUndo,g.extents Extents,substr(s.program, 1, 50) 操作程序
FROM v$session s, v$transaction t, v$rollname r,v$rollstat g
WHERE t.addr = s.taddr
AND t.xidusn = r.usn
AND r.usn = g.usn
ORDER BY t.used_ublk desc;
 
查看对象 
# 检查数据库中无效对象 
SELECT owner, object_type,count(object_name) FROM dba_objects WHERE status= 'INVALID'group by owner,object_type; 

# 检查是否有禁用约束 
SELECT owner, constraint_name, table_name, constraint_type, status 
FROM dba_constraints 
WHERE status ='DISABLE' and constraint_type='P' 

# 检查是否有禁用 trigger 
col owner for a10 
col taigger_name for a10 
cok table_name for a30 
col table_name for a30 
SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 
'DISABLED'; 

# 在某个表下找的索引情况

col column_name for a12
set linesize 180
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name

AND user_indexes.table_name='&tb_name'
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
# 检查与索引相关的字段 
select * from user_ind_columns where index_name=upper('&index_name');

# 检查索引的唯一性的 
col uniq    format a10 heading 'Uniqueness'  justify c trunc 
col indname format a40 heading 'Index Name'  justify c trunc 
col colname format a25 heading 'Column Name' justify c trunc 
break - 
  on indname skip 1 - 
  on uniq 
select 
  ind.uniqueness                  uniq, 
  ind.owner||'.'||col.index_name  indname, 
  col.column_name                 colname 
from 
  dba_ind_columns  col, 
  dba_indexes      ind 
where 
  ind.owner = upper('&ixowner') 
    and 
  ind.table_name = upper('&tabname') 
    and 
  col.index_owner = ind.owner  
    and 
  col.index_name = ind.index_name 
order by 
  col.index_name, 
  col.column_position 

查看当前系统状态
# 检查系统中排行前10的等待事件 
col event for a30 
包括空闲等待事件 
select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait where 
event not like 'SQL%' and event not like 'rdbms%' 
order by wait_time desc) where rownum <=10; 
不包括空闲等待事件 

select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT,state from v$session_wait where wait_class# <> 6

order by wait_time desc) where rownum <=10;

# 查看经常被使用而没有pin在内存中的对象
# 形成生成pin住共享池中当前没有被pin住的对象的sql语句。在执行exec sys.DBMS_SHARED_POOL.keep('JXXXT.IN_GZ_LOGS','P');可能会报出未定义的错误,需要在sqlplus下执行脚本$ORACLE_HOME/rdbms/admin/dbmspool.sql

select 'exec sys.DBMS_SHARED_POOL.keep('||chr(39)||owner||'.'||NAME||chr(39)||','||chr(39)||'P'||chr(39)||');' as sql_to_run
from  V$DB_OBJECT_CACHE where TYPE in ('PACKAGE','FUNCTION','PROCEDURE') and loads > 50 and kept='NO' and executions > 50;
 
# 查看使用了超过10MB内存 而没有pin的对象 
SELECT owner,name,sharable_mem,kept FROM V$DB_OBJECT_CACHE
WHERE sharable_mem > 102400 AND kept = 'NO' ORDER BY sharable_mem DESC;

# 查看大的没有被pin住的对象.
set linesize 150
col sz for a10
col name for a100
col keeped for a6
select to_char(sharable_mem / 1024,'999999') sz_in_K, decode(kept, 'yes','yes  ','') keeped,
owner||','||name||lpad(' ',29 - (length(owner) + length(name))) || '(' ||type||')'name,
null extra, 0 iscur from v$db_object_cache v where sharable_mem > 1024*1000;

# 查看大的没有被pin住的过程,包和函数 
col type for a25
col name for a40   
col owner for a25
select owner,name,type,round(sum(sharable_mem/1024),1) sharable_mem_K from v$db_object_cache  where kept = 'NO'
and (type = 'PACKAGE' or type = 'FUNCTION' or type = 'PROCEDURE')
group by owner,name,type order by 4;
 
需要被pin入内存中的对象主要有:常用的较大的存储对象,如standard、diutil包;编译的常用的triggers;sequences。
最好在开机时就将其pin入内存中。这样,既是使用命令alter system flush shared_pool时,也不会讲这些object flush掉。具体pin对象到内存的方法使用DBMS_SHARED_POOL.keep存储过程。可以用unkeep方法解除其pin状态。
db_object_cache和碎片化
碎片化造成在共享池中虽然有许多小的碎片可以使用,但没有足够大的连续空间,这在共享池中是普遍的现象。消除共享池错误的关键就是即将加载对象的大小是否可能会产生问题。一旦知道了这个存在问题的PL/SQL,那么就可以在数据库启动时(这时共享池是完全连续的)就将这个代码固定。这将确保在调用大型包时,它已经在共享池里,而不是在共享池中搜索连续的碎片(在使用系统时,这些碎片可能就不复存在)。可以查询V$DB_OBJECT_CACHE视图来判断PL/SQL是否很大并且还没有被标识为"kept"的标记。今后需要加载这些对象时,可能会产生问题(因为它们的大小和需要占用大量连续的内存)。通过查询V$DB_OBJECT_CACHE表,可以发现那些没有固定,但由于所需空间太大而很有可能导致潜在问题的对象。

# 查询一下回滚段的使用情况,其中USED_UREC为undo记录的使用条目数,USED_UBLK为undo块的使用数目
set linesize 180 

SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk 
from v$session a, v$transaction b
WHERE a.saddr = b.ses_addr;

# 查看锁住对象的会话信息,操作系统进程信息
set linesize 180
select object_name,machine,s.sid,s.serial#,p.spid
from v$locked_object l,dba_objects o ,v$session s,v$process p
where l.object_id=o.object_id and l.session_id=s.sid
and  s.paddr=p.addr

# 根据进程查看sql

select sql_text
from v$sqltext_with_newlines
where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=(select ses.sid from v$session ses,v$process pro
where pro.spid=&spid
and ses.paddr=pro.addr)) order by address,piece;

# 查看被锁的表的被锁时间 
set linesize 180
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;

# 查看被锁的对象和引起锁的sql

select a.sid,a.username,d.object_name, b.sql_text
from v$session a,v$sql b, v$locked_object c,dba_objects d
where a.sql_hashvalue=b.hash_value 
and a.sid = c.session_id
and d.object_id = c.object_id;

# 查看锁定的会话信息 
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time

# 杀死相关会话

alter system kill session 'sid,serial#';

# 如果出现ora-00031错误,则

alter system kill session 'sid,serial#' immediate;

# 亦可先查询该会话相对应的操作系统进程,在操作系统上进行kill
TOP SQL 
# 逻辑读 TOP 10 
select *
  from (select sqt.logicr logical_Reads,
               sqt.exec Executions,
               decode(sqt.exec, 0, to_number(null), (sqt.logicr / sqt.exec)) Reads_per_Exec ,
               (100 * sqt.logicr) /
               (SELECT sum(e.VALUE) - sum(b.value) 
                  FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                 WHERE B.SNAP_ID =7634
                   AND E.SNAP_ID =7637
                   AND B.DBID = 3629726729
                   AND E.DBID = 3629726729
                   AND B.INSTANCE_NUMBER = 1
                   AND E.INSTANCE_NUMBER = 1
                   and e.STAT_NAME = 'session logical reads'
                   and b.stat_name = 'session logical reads') Total_rate,
               nvl((sqt.cput / 1000000), to_number(null)) CPU_Time_s,
               nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time_s,
               sqt.sql_id,
               decode(sqt.module, null, null, 'Module: ' || sqt.module) SQL_Module,
               nvl(st.sql_text, to_clob('** SQL Text Not Available **')) SQL_Text
          from (select sql_id,
                       max(module) module,
                       sum(buffer_gets_delta) logicr,
                       sum(executions_delta) exec,
                       sum(cpu_time_delta) cput,
                       sum(elapsed_time_delta) elap
                  from dba_hist_sqlstat
                 where dbid = 3629726729
                   and instance_number = 1
                   and 7634 < snap_id
                   and snap_id <= 7637
                 group by sql_id) sqt,
               dba_hist_sqltext st
         where st.sql_id(+) = sqt.sql_id
           and st.dbid(+) = 3629726729
           and (SELECT sum(e.VALUE) - sum(b.value)
                  FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                 WHERE B.SNAP_ID =7634
                   AND E.SNAP_ID =7637
                   AND B.DBID = 3629726729
                   AND E.DBID = 3629726729
                   AND B.INSTANCE_NUMBER = 1
                   AND E.INSTANCE_NUMBER = 1
                   and e.STAT_NAME = 'session logical reads'
                   and b.stat_name = 'session logical reads') > 0
         order by nvl(sqt.logicr, -1) desc, sqt.sql_id)
 where rownum < 65and(rownum <= 10
                   or Total_rate > 1);
 
# 物理读 TOP 10

select *
  from (select sqt.dskr Physical_Reads,
               sqt.exec Executions,
               decode(sqt.exec, 0, to_number(null), (sqt.dskr / sqt.exec)) Reads_per_Exec ,
               (100 * sqt.dskr) /
               (SELECT sum(e.VALUE) - sum(b.value) 
                  FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                 WHERE B.SNAP_ID = $P{p_beg_snap}
                   AND E.SNAP_ID = $P{p_end_snap}
                   AND B.DBID = 1273705906
                   AND E.DBID = 1273705906
                   AND B.INSTANCE_NUMBER = 1
                   AND E.INSTANCE_NUMBER = 1
                   and e.STAT_NAME = 'physical reads'
                   and b.stat_name = 'physical reads') Total_rate,
               nvl((sqt.cput / 1000000), to_number(null)) CPU_Time_s,
               nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time_s,
               sqt.sql_id,
               decode(sqt.module, null, null, 'Module: ' || sqt.module) SQL_Module,
               nvl(st.sql_text, to_clob('** SQL Text Not Available **')) SQL_Text
          from (select sql_id,
                       max(module) module,
                       sum(disk_reads_delta) dskr,
                       sum(executions_delta) exec,
                       sum(cpu_time_delta) cput,
                       sum(elapsed_time_delta) elap
                  from dba_hist_sqlstat
                 where dbid = 1273705906
                   and instance_number = 1
                   and $P{p_beg_snap} < snap_id
                   and snap_id <= $P{p_end_snap}
                 group by sql_id) sqt,
               dba_hist_sqltext st
         where st.sql_id(+) = sqt.sql_id
           and st.dbid(+) = 1273705906
           and (SELECT sum(e.VALUE) - sum(b.value)
                  FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                 WHERE B.SNAP_ID = $P{p_beg_snap}
                   AND E.SNAP_ID = $P{p_end_snap}
                   AND B.DBID = 1273705906
                   AND E.DBID = 1273705906
                   AND B.INSTANCE_NUMBER = 1
                   AND E.INSTANCE_NUMBER = 1
                   and e.STAT_NAME = 'physical reads'
                   and b.stat_name = 'physical reads') > 0
         order by nvl(sqt.dskr, -1) desc, sqt.sql_id)
 where rownum < 65and(rownum <= 10
                   or Total_rate > 1);
 
# 消耗CPU TOP 10

select *
  from (select nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time_s,
               nvl((sqt.cput / 1000000), to_number(null)) CPU_Time_s,
               sqt.exec Executions,
               decode(sqt.exec,
                      0,
                      to_number(null),
                      (sqt.elap / sqt.exec / 1000000)) Elap_per_Exec_s,
               (100 *
               (sqt.elap / (SELECT sum(e.VALUE) - sum(b.value)
                               FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                              WHERE B.SNAP_ID = 7396
                                AND E.SNAP_ID = 7399
                                AND B.DBID = 1273705906
                                AND E.DBID = 1273705906
                                AND B.INSTANCE_NUMBER = 1
                                AND E.INSTANCE_NUMBER = 1
                                and e.STAT_NAME = 'DB time'
                                and b.stat_name = 'DB time')))/1000 Total_DB_Time_rate,
               sqt.sql_id,
               to_clob(decode(sqt.module,
                              null,
                              null,
                              'Module: ' || sqt.module)) SQL_Module,
               nvl(st.sql_text, to_clob(' ** SQL Text Not Available ** ')) SQL_Text
          from (select sql_id,
                       max(module) module,
                       sum(elapsed_time_delta) elap,
                       sum(cpu_time_delta) cput,
                       sum(executions_delta) exec
                  from dba_hist_sqlstat
                 where dbid = 65972167
                   and instance_number = 1
                   and 7396 < snap_id
                   and snap_id <= 7399
                 group by sql_id) sqt,
               dba_hist_sqltext st
         where st.sql_id(+) = sqt.sql_id
           and st.dbid(+) = 1273705906
order by nvl(sqt.cput, -1) desc, sqt.sql_id)
 where rownum < 65
   and (rownum <= 10 or Total_DB_Time_rate > 1);
 
# 执行时间 TOP 10
select *
  from (select nvl((sqt.elap / 1000000), to_number(null)) Elapsed_Time_s,
               nvl((sqt.cput / 1000000), to_number(null)) CPU_Time_s,
               sqt.exec Executions,
               decode(sqt.exec,
                      0,
                      to_number(null),
                      (sqt.elap / sqt.exec / 1000000)) Elap_per_Exec_s,
               (100 *
               (sqt.elap / (SELECT sum(e.VALUE) - sum(b.value)
                               FROM DBA_HIST_SYSSTAT b, DBA_HIST_SYSSTAT e
                              WHERE B.SNAP_ID = $P{p_beg_snap}
                                AND E.SNAP_ID = $P{p_end_snap}
                                AND B.DBID = 1273705906
                                AND E.DBID = 1273705906
                                AND B.INSTANCE_NUMBER = 1
                                AND E.INSTANCE_NUMBER = 1
                                and e.STAT_NAME = 'DB time'
                                and b.stat_name = 'DB time')))/1000 Total_DB_Time_rate,
               sqt.sql_id,
               to_clob(decode(sqt.module,
                              null,
                              null,
                              'Module: ' || sqt.module)) SQL_Module,
               nvl(st.sql_text, to_clob(' ** SQL Text Not Available ** ')) SQL_Text
          from (select sql_id,
                       max(module) module,
                       sum(elapsed_time_delta) elap,
                       sum(cpu_time_delta) cput,
                       sum(executions_delta) exec
                  from dba_hist_sqlstat
                 where dbid = 1273705906
                   and instance_number = 1
                   and $P{p_beg_snap} < snap_id
                   and snap_id <= $P{p_end_snap}
                 group by sql_id) sqt,
               dba_hist_sqltext st
         where st.sql_id(+) = sqt.sql_id
           and st.dbid(+) = 1273705906
         order by nvl(sqt.elap, -1) desc, sqt.sql_id)
 where rownum < 65
   and (rownum <= 10 or Total_DB_Time_rate > 1);

查找需要使用绑定变量的sql
select substr(sql_text,1,40), count(*)
from v$sqlarea
group by substr(sql_text,1,40) having count(*) > 50;
 
再 select sql_text from v$sqlarea where sql_text like 'insert into test %'; 找出具体的sql代码
检查Latch的相关SQL 
# 查询当前数据库最繁忙的Buffer,TCH(Touch)越大表示访问次数越高
SELECT *
  FROM (  SELECT addr,
                 ts#,
                 file#,
                 dbarfil,
                 dbablk,
                 tch
            FROM x$bh
        ORDER BY tch DESC)
 WHERE ROWNUM < 11;
 

# 查看latch的命中率

SQL>SELECT name, gets, misses, sleeps, 
      immediate_gets, immediate_misses
     FROM v$latch
   WHERE name = 'cache buffers chains';

#查找数据块中的热点块 

SELECT *

  FROM (SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, SUM(TCH) TOUCHTIME

          FROM X$BH B, DBA_OBJECTS O

         WHERE B.OBJ = O.DATA_OBJECT_ID

           AND B.TS# > 0

         GROUP BY O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE

         ORDER BY SUM(TCH) DESC)

 WHERE ROWNUM <= 10;

#根据文件号和块号查找数据库对象

select owner, segment_name, partition_name, tablespace_name 
from dba_extents
where relative_fno = &v_dba_rfile
 and &v_dba_block between block_id and block_id + blocks - 1;
# 如果在Top 5中发现latch free热点块事件时,可以从V$latch_children中查询具体的子Latch信息
SELECT *
  FROM (SELECT   addr, child#, gets, misses, sleeps, immediate_gets igets,
                immediate_misses imiss, spin_gets sgets
            FROM v$latch_children
           WHERE NAME = 'cache buffers chains'
        ORDER BY sleeps DESC)
 WHERE ROWNUM < 11;

# 查看引起latch: cache buffers chains的sql
SQL> select * from (select 
    count(*), 
    sql_id, 
    nvl(o.object_name,ash.current_obj#) objn,
    substr(o.object_type,0,10) otype,
     3    4    5    6        CURRENT_FILE# fn,
         CURRENT_BLOCK# blockn
   from  v$active_session_history ash
       , all_objects o
   where event like 'latch: cache buffers chains'
     and o.object_id (+)= ash.CURRENT_OBJ#
   group by sql_id, current_obj#, current_file#,
                  current_block#, o.object_name,o.object_type
   order by  count(*) desc )where rownum <=10;
 
日常管理
#查看当前用户的trace文件
SELECT      u_dump.VALUE
         || '/'
         || db_name.VALUE
         || '_ora_'
         || v$process.spid
         || NVL2 (v$process.traceid, '_' || v$process.traceid, NULL)
         || '.trc'
            "Trace File"
  FROM            v$parameter u_dump
               CROSS JOIN
                  v$parameter db_name
            CROSS JOIN
               v$process
         JOIN
            v$session
         ON v$process.addr = v$session.paddr
 WHERE       u_dump.name = 'user_dump_dest'
         AND db_name.name = 'db_name'
         AND v$session.audsid = SYS_CONTEXT ('userenv', 'sessionid')
#查询某段时间内执行过的sql
select a.sql_id,dbms_lob.substr(b.sql_text,4000,1) from dba_hist_active_sess_history a, dba_hist_sqltext b
where sample_time between to_date('20100930:09:00','yyyymmdd:hh24:mi')
and to_date('20100930:09:01','yyyymmdd:hh24:mi') and b.sql_id=a.sql_id
union all
select a.sql_id ,dbms_lob.substr(b.sql_text,4000,1)from v$active_session_history a ,v$sqlarea b
where sample_time between to_date('20100930:09:00','yyyymmdd:hh24:mi') and
to_date('20100930:09:01','yyyymmdd:hh24:mi') and b.sql_id=a.sql_id
由于v$active_session_history和dba_hist_active_sess_history的数据来源于awr和ash采样,记录并不完全,故查询结果并不准确。
#查看sql的实际执行计划
SELECT sql_id, address, hash_value FROM v$sql 
 WHERE sql_text like ¨%TAG%¨; 
SQL_ID  ADDRESS HASH_VALUE 
-------- -------- ---------- 
40qhh45kcnfbv  82157784 1224822469 
#通过sqlid查询库缓冲区中的sql执行计划
SELECT * FROM TABLE(dbms_xplan.display_cursor('40qhh45kcnfbv',0));

# 查找你的session信息

SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS

FROM V$SESSION WHERE audsid = userenv('SESSIONID');

# 当machine已知的情况下查找session

SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL

FROM V$SESSION

WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';

# 查找当前被某个指定session正在运行的sql语句。寻找被指定session执行的SQL语句是一个公共需求,如果session是瓶颈的主要原因,那根据其当前在执行的语句可以查看session在做些什么。 假设sessionID为100

select b.sql_text

from v$session a,v$sqlarea b

where a.sql_hashvalue=b.hash_value and a.sid=100

#查看sql执行状态

select status,last_call_et,event from v$session where sid=&id;

#查看客户端和应用信息

select osuser,machine,terminal,process,program,client_info,action,module from v$session
where sid=&id and seq#=&seq

#查看会话消耗资源的情况,以CPU资源为例,不同的资源可以根据v$statname和v$sesstat关联进行查询,常用的有session logical reads, CPU used by this session, db block changes, redo size, 
physical writes, parse count (hard), parse count (total), sorts (memory), and sorts (disk)等
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,c.value/60/100 value,d.name
from v$session a,v$process b,v$sesstat c,v$statname d
where d.name='CPU used by this session' and c.sid=a.sid and a.paddr=b.addr and d.statistic#=c.statistic#
order by c.value desc

注意:v$sysstat 和v$sesstat差别如下: 
v$sesstat只保存session数据,而v$sysstat则保存所有sessions的累积值。
v$sesstat只是暂存数据,session退出后数据即清空。v$sysstat则是累积的,只有当实例被shutdown才会清空。
v$sesstat不包括统计项名称,如果要获得统计项名称则必须与v$sysstat或v$statname连接查询获得。 
#通过sqlid查询库AWR中的sql执行计划

SELECT * FROM table (DBMS_XPLAN.DISPLAY_AWR ('40qhh45kcnfbv'));

#查看某用户的PID和SPID

select pid,spid from v$process

where addr in (select paddr from v$session where username='SYSTEM');

#查看隐含参数

select x.ksppinm name, y.ksppstvl value, x.ksppdesc describ

from sys.x$ksppi x , sys.x$ksppcv y

where x.indx = y.indx

and x.ksppinm like '%&par%';

#查看对象大小,对象大小以已分配的extent统计

select segment_name, bytes/1024/1024 MB

from user_segments

where segment_type = 'TABLE';

或者

Select SEGMENT_NAME,Sum(bytes)/1024/1024 From User_Extents where segment_name='BIG' group by segment_name;

#查看等待事件的详细情况

create or replace procedure WaitHistogram(pFilter varchar2)
is
  vTotalWaitCount integer;
  cursor rec_cur is 
  select rpad(substr(event,1,40),42) event,
                         lpad(to_char(wait_time_MILLI,999999999.99),13) wtm,
                         lpad(to_char(wait_count,9999999999.99),13) wct,
                         100*(sum(wait_count) over(order by event,wait_time_milli)) pct_rt
                         from v$event_histogram where event=pFilter
                         order by 1,2;
  c_event varchar2(100);
  c_wtm varchar2(100);
  c_wct varchar2(100);
  c_pct_rt number(20,2);
begin
 select sum(wait_count) into vTotalWaitCount  from v$event_histogram where event=pFilter;
      dbms_output.enable(800000);
      dbms_output.put_line(rpad('event',45)||'Wait time   Wait count Pct_rt');
      open rec_cur;
      fetch rec_cur into c_event,c_wtm,c_wct,c_pct_rt;
      while rec_cur%found loop
          dbms_output.put_line(c_event||' '||c_wtm||' '||c_wct||' '||to_char((c_pct_rt/vTotalWaitCount),0999.99));
      fetch rec_cur into c_event,c_wtm,c_wct,c_pct_rt;
end loop;
close rec_cur;
      end ;
      /   
exec WaitHistogram(pfilter=>'gc buffer busy');

# 查看表的统计信息

select table_name,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len,global_stats,user_stats,sample_size,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') 
from dba_tables where owner = upper(nvl('&Owner',user)) and table_name=upper('&table_name');
# 查看分区的统计信息

select table_name,PARTITION_NAME ,composite,SUBPARTITION_COUNT,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len,global_stats,user_stats,sample_size,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') 
from dba_tab_partitions where 
and table_name=upper('&table_name');

# 查看子分区的统计信息

select table_name,PARTITION_NAME ,subpartition_name,subpartition_position,num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len,global_stats,user_stats,sample_size,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss') 
from dba_TAB_SUBPARTITIONS where table_name=upper('&table_name');

#查看列上的统计信息

select
    COLUMN_NAME,
    decode(t.DATA_TYPE,
           'NUMBER',t.DATA_TYPE||'('||
           decode(t.DATA_PRECISION,
                  null,t.DATA_LENGTH||')',
                  t.DATA_PRECISION||','||t.DATA_SCALE||')'),
                  'DATE',t.DATA_TYPE,
                  'LONG',t.DATA_TYPE,
                  'LONG RAW',t.DATA_TYPE,
                  'ROWID',t.DATA_TYPE,
                  'MLSLABEL',t.DATA_TYPE,
                  t.DATA_TYPE||'('||t.DATA_LENGTH||')') ||' '||
    decode(t.nullable,
              'N','NOT NULL',
              'n','NOT NULL',
              NULL) col,
    NUM_DISTINCT,
    DENSITY,
    NUM_BUCKETS,
    NUM_NULLS,
    GLOBAL_STATS,
    USER_STATS,
    SAMPLE_SIZE,
    HISTOGRAM,
    AVG_COL_LEN,
    to_char(t.last_analyzed,'yyyy-mm-dd hh24:mi:ss')
from dba_tab_columns t
where 
    table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user));

# 查看分区表列上的统计信息

select

    TABLE_NAME,
    PARTITION_NAME,
    COLUMN_NAME,
    NUM_DISTINCT,
    DENSITY,
    NUM_BUCKETS,
    NUM_NULLS,
    GLOBAL_STATS,
    USER_STATS,
    SAMPLE_SIZE,
    to_char(t.last_analyzed,'YYYY-MM-DD HH24:MI:SS')
from 
    dba_PART_COL_STATISTICS t
where 
    table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user))
/
# 查看子分区上列的统计信息

select 
    p.PARTITION_NAME,
    t.SUBPARTITION_NAME,
    t.COLUMN_NAME,
    t.NUM_DISTINCT,
    t.DENSITY,
    t.NUM_BUCKETS,
    t.NUM_NULLS,
    t.GLOBAL_STATS,
    t.USER_STATS,
    t.SAMPLE_SIZE,
    to_char(t.last_analyzed,'YYYY-MM-DD HH24:MI:SS')
from 
    dba_SUBPART_COL_STATISTICS t, 
    dba_tab_subpartitions p
where 
    t.table_name = upper('&Table_name')
and t.owner = upper(nvl('&Owner',user))
and t.subpartition_name = p.subpartition_name
and t.owner = p.table_owner
and t.table_name=p.table_name;

#索引的统计信息

select 
    INDEX_NAME,
    UNIQUENESS,
    BLEVEL BLev,
    LEAF_BLOCKS,
    DISTINCT_KEYS,
    NUM_ROWS,
    AVG_LEAF_BLOCKS_PER_KEY,
    AVG_DATA_BLOCKS_PER_KEY,
    CLUSTERING_FACTOR,
    GLOBAL_STATS,
    USER_STATS,
    SAMPLE_SIZE,
    to_char(t.last_analyzed,'YYYY-MM-DD HH24:MI:SS')
from 
    dba_indexes t
where 
    table_name = upper('&Table_name')
and table_owner = upper(nvl('&Owner',user));

#查看分区索引的统计信息

select
    i.INDEX_NAME,
    i.COLUMN_NAME,
    i.COLUMN_POSITION,
    decode(t.DATA_TYPE,
           'NUMBER',t.DATA_TYPE||'('||
           decode(t.DATA_PRECISION,
                  null,t.DATA_LENGTH||')',
                  t.DATA_PRECISION||','||t.DATA_SCALE||')'),
                  'DATE',t.DATA_TYPE,
                  'LONG',t.DATA_TYPE,
                  'LONG RAW',t.DATA_TYPE,
                  'ROWID',t.DATA_TYPE,
                  'MLSLABEL',t.DATA_TYPE,
                  t.DATA_TYPE||'('||t.DATA_LENGTH||')') ||' '||
           decode(t.nullable,
                  'N','NOT NULL',
                  'n','NOT NULL',
                  NULL) col
from 
    dba_ind_columns i,
    dba_tab_columns t
where 
    i.table_name = upper('&Table_name')
and owner = upper(nvl('&Owner',user))
and i.table_name = t.table_name
and i.column_name = t.column_name
order by index_name,column_position;

# 查看子分区索引的统计信息

select 
    t.INDEX_NAME,
    t.PARTITION_NAME,
    t.SUBPARTITION_NAME,
    t.BLEVEL BLev,
    t.LEAF_BLOCKS,
    t.DISTINCT_KEYS,
    t.NUM_ROWS,
    t.AVG_LEAF_BLOCKS_PER_KEY,
    t.AVG_DATA_BLOCKS_PER_KEY,
    t.CLUSTERING_FACTOR,
    t.GLOBAL_STATS,
    t.USER_STATS,
    t.SAMPLE_SIZE,
    to_char(t.last_analyzed,'MM-DD-YYYY')
from 
    dba_ind_subpartitions t, 
    dba_indexes i
where 
    i.table_name = upper('&Table_name')
and i.table_owner = upper(nvl('&Owner',user))
and i.owner = t.index_owner
and i.index_name=t.index_name;

#正在运行的存储过程

col name format a56 
select name                                        
from v$db_object_cache                             
where locks > 0 and pins > 0 and type='PROCEDURE';

select sid,name from v$access;
SELECT s.SID, s.OSUSER, s.USERNAME, s.MACHINE, s.PROCESS,a.object FROM V$SESSION s ,v$access a, v$db_object_cache  d WHERE s.sid = a.sid and a.object=d.name and d.type='PROCEDURE';

# 查询外键约束(查scott用户emp表的所有父表)  
set linesize 120
col owner for a8
col table_name for a12
col constraint_name for a20
col column_name for a20
select c.constraint_name,cc.column_name,rcc.owner,rcc.table_name,rcc.column_name 
from dba_constraints c,dba_cons_columns cc,dba_cons_columns rcc  
where c.owner='SCOTT' 
and c.table_name='EMP' and c.constraint_type='R' and c.owner=cc.owner 
and c.constraint_name=cc.constraint_name and c.r_owner=rcc.owner and c.r_constraint_name=rcc.constraint_name 
and cc.position=rcc.position 
order by c.constraint_name,cc.position;

# 查询连接到某表的所有外键(查HR用户下EMPLOYEES表的所有子表) 
set linesize 120
col owner for a8
col pk_tab for a12
col fk_tab for a12
col pk for a15
col fk for a15
col pk_col for a12
col fk_col for a12
select rcc.owner,rcc.table_name pk_tab,rcc.constraint_name pk,rcc.column_name pk_col,c.table_name fk_tab,c.constraint_name fk,cc.column_name fk_col
from dba_constraints c,dba_cons_columns cc,dba_cons_columns rcc
where c.owner='HR' and rcc.table_name='EMPLOYEES'
and c.constraint_type='R'
and c.owner=cc.owner and c.constraint_name=cc.constraint_name 
and c.r_constraint_name=rcc.constraint_name
order by c.constraint_name,cc.position;

# 查询主键唯一键约束(HR用户Employees表的主键唯一键约束) 
set linesize 120
col constraint_type for a8
col constraint_name for a20
col column_name for a20
select c.constraint_name,c.constraint_type,cc.column_name 
from dba_constraints c,dba_cons_columns cc 
where c.owner='HR' and c.table_name='EMPLOYEES' and c.owner=cc.owner and 
c.constraint_name=cc.constraint_name and c.constraint_type in ('P','U') 
order by c.constraint_type,c.constraint_name,cc.position; 

 

感谢$无为公子、萧雨、惜分飞的帮助

参考至:http://mlxia.iteye.com/blog/741227

            http://blog.csdn.net/soulcq/article/details/5418085
            http://www.dbtan.com/2010/05/latch-free.html

            http://www.2cto.com/database/201107/96826.html
            http://blog.csdn.net/robinson1988/article/details/4793962
            http://blog.csdn.net/tianlesoftware/article/details/5263238
            http://www.laoxiong.net/dbms_stats_and_analyze_and_global_statistics.html
            http://www.laoxiong.net/wp-content/uploads/2008/12/sosi.sql
            http://www.cnblogs.com/caizhimin816/archive/2012/12/21/2827375.html
            https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=1019722.6

本文原创,转载请注明出处,作者

如有错误,欢迎指正

邮箱:czmcj@163.com 

 
 
posted @ 2013-11-13 17:08  陳聽溪  阅读(533)  评论(0)    收藏  举报