--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语句
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 * from user_source;
--关于v$sqltext,v$sql,v$sqlarea的区别
关于共同点:
1)都存储了sql内容
2) 记录的都是位于内存中的sql内容
3) 因为是内存,所以都不保留历史记录
不同点:
1)存储的为止不都是相同。其中v$sql和v$sqlarea存储的sql都是位于shared sql area中的sql,而v$sqltext是位于sga中的sql。但文档没有明确说明这里的sga是否还包含了psa(私有sql区域--共享服务器模式下)。
2)存储sql的方式也不同,v$sql和v$sqlarea都是用一行来存储sql全文,而v$sqltext用一行存储sql的一行。
3)v$sql不存储包含group by 的sql语句。通常这个视图,在每个查询执行完成后更新,但对于执行很久的sql,它是每5秒更新一次,这点对于查看sql执行状态是有意义的。
4)存储的明细不同--这是最基本的。
后顺便提一下,v$sqltext_with_newline和v$sqltext是一样,不同的是前者并把换行符和tab替换为空格 ,这样更容易阅读。V$SQLSTATS和V$SQL,v$sqlarea一样都有提供CPU的统计数据