oracle资源查询常用视图

--v$session中STATUS:这列用来判断 session状态是

Achtive:正执行 SQL语句 (waiting for/using a resource)

Inactive:等待操作 (即等待需要执行的 SQL语句 )

Killed:被标注为删除

--资源锁

 

select b.SESSION_ID, 
       b.ORACLE_USERNAME, 
       b.OS_USER_NAME, 
       b.PROCESS, 
       b.LOCKED_MODE, 
       a.owner, 
       a.object_name, 
       a.object_id, 
       a.object_type, 
       b.XIDUSN, 
       b.XIDSLOT, 
       b.XIDSQN 
  from all_objects a, v$locked_object b 
 where a.object_id = b.object_id

--查看是哪个session引起的(接上面)
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'325,55';

其中325为sid,55为serial#。

--外键查询

SELECT a.constraint_name 关系,
       a.owner           外键拥有者,
       a.table_name      外键表,
       c.column_name     外键列,
       b.owner           主键拥有者,
       b.table_name      主键表,
       d.column_name     主键列
FROM dba_constraints  a,
     dba_constraints  b,
     dba_cons_columns c,
     dba_cons_columns d
WHERE a.r_constraint_name = b.constraint_name
      AND a.constraint_type = 'R'
      AND b.table_name = 'NBZ_TMR_GROUP'
      AND b.constraint_type = 'P'
      AND a.r_owner = b.owner
      AND a.constraint_name = c.constraint_name
      AND b.constraint_name = d.constraint_name
      AND a.owner = c.owner
      AND a.table_name = c.table_name
      AND b.owner = d.owner
      AND b.table_name = d.table_name

--sql执行监控

select
b.sql_text, --SQL内容
a.MACHINE, --哪台机器运行的SQL
a.USERNAME,--哪个用户运行的SQL
a.MODULE,--是哪运行方式
c.sofar/totalwork*100,--工作进行了百分之多少
c.elapsed_seconds, --己经用了多少时间(秒)
c.time_remaining --还剩多少时间(秒)
from v$session a, v$sqlarea b,v$session_longops c
where a.sql_hash_value=b.HASH_VALUE
and a.sid=c.sid and a.SERIAL#=c.SERIAL#;

select sid,v$session.username 用户名,last_call_et 持续时间,status 状态,LOCKWAIT 等待锁,machine 用户电脑名,logon_time 开始登入时间,sql_text from v$session ,v$process ,v$sqlarea
  where paddr=addr and sql_hash_value=hash_value 
  and status='ACTIVE' and v$session.username is not null
  order by last_call_et desc;

1.查看消耗资源最多的 SQL:

SELECT
  sql_text,
  sorts 排序次数,
  cpu_time 解析执行的cpu时间,
  elapsed_time 解析执行共用时间,
  hash_value,
  executions 执行次数,
  buffer_gets 读取缓冲的次数,
  disk_reads 物理读的数量,
  parse_calls 解析调用软硬次数,
  invalidations cursor失效次数,
  loads 载入载出数量,
  ROWS_PROCESSED 总列数,--解析 SQL语句返回的总列数 
  optimizer_mode sql的优化器模型,
  optimizer_cost 查询成本
FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC ;


2. 查看某条 SQL 语句的资源消耗:

SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls

FROM V$SQLAREA

WHERE hash_Value = 228801498 AND address = hextoraw( 'CBD8E4B0' );

 --查询表占用空间的大小(total出来是多少G)

select segment_name, total from (
     select segment_name,sum(bytes)/1024/1024/1024 total from dba_segments
     where /*owner not in 'SYS'*/owner = 'CGIDATA' and segment_type = 'TABLE'
     group by segment_name) order by total desc;

1GB=1024MB=1024*1024KB=1024*1024*1024Byte=1024*1024*1024*8位
1个英文字母=1Byte,1个汉字=2Byte

dba_segments字段说明
SEGMENT_TYPE:段的类型,可能是table,index,logindex,lobsegment等。
header_file:表示这个段的头在哪个数据文件里,因为段可以跨数据文件。
header_block:表示这个段的头在数据文件的第几个block里。
bytes:段的大小(目前占用的大小?)
blocks:段占用了多少个block
extents:分配了多少个extent。
initial_extent:初始分配的extent大小(以byte计)。
next_extent:下一个分配的extent大小(以byte计)。如果为空表示是自动分配。(每个extent可以有不同大小,如果设置为uniform的话,每个extent就一样大小了)
min_extents:最少分配多少个extent(以个数计)。
max_extents:最多分配多少个extent(以个数计)。
pct_increase:percent increase表示第三个或后续的extent的大小比前一个增加的百分比,如第一个extent是64K,第二个是64K,pct_increase=50%,则第三个extent是64K*1.5=96K,第四个96K*1.5=144K,依次类推。
freelists:这个字段在字典管理的表空间中才有意义。
fresslist_groups:这个字段在字典管理的表空间中才有意义。
relative_fno:这个段所在数据文件的relative fno
buffer_pool:这个段的数据将被读取到哪一个buffer pool里

3.查找前10条性能差的sql语句

Sql代码
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea   

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 ;说明:
EXECUTIONS表示同一条SQL语句一共执行了多少次,SORTS表示排序的次数,DISK_READS表示物理读的数量

--回滚段

select sid,v$session.username 用户名,last_call_et 持续时间,status 状态,LOCKWAIT 等待锁,machine 用户电脑名,logon_time 开始登入时间,sql_text from v$session ,v$process ,v$sqlarea
  where paddr=addr and sql_hash_value=hash_value 
  and status='ACTIVE' and v$session.username is not null
  order by last_call_et desc;

--数据库空间查询

select a.file_id "FileNo",a.tablespace_name "Tablespace_name",
round(a.bytes/1024/1024,4) "Total MB",
round((a.bytes-sum(nvl(b.bytes,0)))/1024/1024,4) "Used MB",
round(sum(nvl(b.bytes,0))/1024/1024,4) "Free MB",
round(sum(nvl(b.bytes,0))/a.bytes*100,4) "%Free"
from dba_data_files a, dba_free_space b
where a.file_id=b.file_id(+)
group by a.tablespace_name,
a.file_id,a.bytes order by a.tablespace_name

--数据库中查询定义语句(在部署环境没有查看package的权限,可以通过查询表来看package的定义。有时部署了没有起作用可以通过这个查询看看部署是不是最新的)

SELECT * FROM DBA_SOURCE WHERE TYPE = 'PACKAGE' /*and OWNER='CGIDATA'*/ AND NAME='NBZ_GET_NEXT_TASK'  ORDER BY NAME, LINE;
select OWNER,COUNT(*) from DBA_SOURCE GROUP BY OWNER;
SELECT * FROM ALL_SOURCE  T;

select * from user_source; 

--关于v$sqltext,v$sql,v$sqlarea的区别

关于共同点:
1)都存储了sql内容
2) 记录的都是位于内存中的sql内容
3) 因为是内存,所以都不保留历史记录

不同点:
1)存储的为止不都是相同。其中v$sqlv$sqlarea存储的sql都是位于shared sql area中的sql,v$sqltext是位于sga中的sql。但文档没有明确说明这里的sga是否还包含了psa(私有sql区域--共享服务器模式下)。
2)存储sql的方式也不同,v$sqlv$sqlarea都是用一行来存储sql全文,而v$sqltext用一行存储sql的一行。
3)v$sql不存储包含group by sql语句。通常这个视图,在每个查询执行完成后更新,但对于执行很久的sql,它是每5秒更新一次,这点对于查看sql执行状态是有意义的。
4)存储的明细不同--这是最基本的。

后顺便提一下,v$sqltext_with_newlinev$sqltext是一样,不同的是前者并把换行符和tab替换为空格 ,这样更容易阅读。V$SQLSTATSV$SQL,v$sqlarea一样都有提供CPU的统计数据

 

你可能感兴趣的:(常用视图)