/*當前正在使用何種sql優化方式:
用explain plan產生explain plan,檢查plan_table中id=0的position列的值。*/linux
select decode(nvl(position,-1),-1,'rbo',1,'cbo') from plan_table where id=0;
--查看還沒提交的事務sql
select * from v$locked_object; select * from v$transaction;
--監控事例的等待 數據庫
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;
--查看段(表段、索引段)所使用空間的大小,替換<>中的內容。c#
select owner,segment_name,sum(bytes)/1024/1024 from dba_segments where owner=&v_owner and segment_name=&v_segment_name group by owner,segment_name order by 3 desc;
--oracle全部回滾段狀態的檢查:windows
select segment_name,owner,tablespace_name,initial_extent,next_extent,dba_rollback_segs.status from dba_rollback_segs,v$datafile where file_id=file#;
--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的值)*/服務器
--查看回滾段的使用狀況,哪一個用戶正在使用回滾段的資源:網絡
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;
--回滾段查看session
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
--查看回滾段名稱及大小併發
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 ;
--查看回滾段:
col name format a10 set linesize 100 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;
/*數據庫回滾段性能檢查:
檢查ratio執行*/
select sum(waits) * 100 /sum(gets) "ratio",sum(waits) "waits",sum(gets) "gets" from v$rollstat;
--檢查count/value執行:
select class,count from v$waitstat where class like '%undo%'; select value from v$sysstat where name='consistent gets';
--(二者的value值相除)
--查看哪些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;
--回滾段的爭用狀況
select name,waits,gets,waits/gets "ratio" from v$rollstat a,v$rollname b where a.usn = b.usn;
--判斷回滾段競爭的sql語句:(當ratio大於2時存在回滾段競爭,須要增長更多的回滾段)
select rn.name,rs.gets,rs.waits,(rs.waits/rs.gets)*100 ratio from v$rollstat rs,v$rollname rn where rs.usn = rn.usn
--判斷恢復日誌競爭的sql語句:(immediate_contention或wait_contention的值大於1時存在競爭)
select name,(t.immediate_misses/ decode((t.immediate_gets+t.immediate_misses),0,-1, (t.immediate_gets+t.immediate_misses)))*100 immediate_contention, (t.misses/decode((t.gets+t.misses),0,-1,(t.gets+t.misses)))*100 wait_contention from v$latch t where name in ('redo copy','redo allocation')
--查看數據文件的大小及頭大小(hwm)(能夠resize的最小空間)和文件頭大小:
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(+);
/*(運行以上查詢,咱們能夠以下信息:
totle_pace:該數據文件的總大小,字節爲單位
free_space:該數據文件的剩於大小,字節爲單位
used_space:該數據文件的已用空間,字節爲單位
data_space:該數據文件中段數據佔用空間,也就是數據空間,字節爲單位
file_head:該數據文件頭部佔用空間,字節爲單位)*/
--查看數據文件的實際使用狀況:
select ceil(max_block * block_size / 1024) from (select max(block_id) max_block from dba_extents where file_id in ( select file_id from dba_data_files d where d.tablespace_name = 'users')) m, (select value / 1024 block_size from v$parameter where name = 'db_block_size') b
--監控文件系統的 i/o 比例
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#;
--查看數據表的參數信息
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
--查看錶是不是分區表:
--例子:
select table_name,partitioned from user_tables where table_name='localusage';
table_name par
------------------------------ --- ---------
localusage yes
--查看分區表的分區名和相應的表空間名:
select table_name,partition_name,tablespace_name from user_tab_partitions where table_name like '%usage%';
--查看索引是不是分區索引:
select index_name,table_name,status,partitioned from user_indexes where table_name like '%usage';
--若是返回的patitioned爲yes,請再執行以下語句來查詢分區索引的類型:
select index_name,table_name,locality from user_part_indexes;
--dual是oracle中的一個實際存在的表,任何用戶都可讀取,經常使用在沒有目標表的select中.
--查看索引段中extent的數量:
select segment_name,count(*) from dba_extents where segment_type='index' and owner='scott' group by segment_name;
--查看系統表中的用戶索引(用來檢查在system表空間內其餘用戶索引的存在):
select count(*) from dba_indexes where tablespace_name='system' and owner not in ('sys','system');
--在某個用戶下找全部的索引
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;
--表、索引的存儲狀況檢查
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;
select segment_name,count(*) from dba_extents where segment_type='index' and owner='&owner' group by segment_name;
--查看一下哪一個用戶在用臨時段:
select username,sid,serial#,sql_address,machine,program,tablespace,segtype,contents from v$session se,v$sort_usage su where se.saddr=su.session_addr;
--查詢oracle的鏈接數
select count(*) from v$session;
--查詢oracle的併發鏈接數
select count(*) from v$session where status='active';
--查看不一樣用戶的鏈接數
select username,count(username) from v$session where username is not null group by username;
--當前的鏈接數
select count(*) from v$process
--查看oracle最大鏈接
show parameter processes
select value from v$parameter where name ='processes'
--修改最大鏈接數:
alter system set processes = &value scope = spfile;
--例如:
alter system set processes = 300 scope = spfile;
--主機產生的鏈接數
select username,machine,program,status,count(machine) as connect_num from v$session group by username,machine,program,status order by machine;
--按主機名查詢鏈接
select count(*) from v$session where machine ='hostname';
--按機器名分組查
select username,machine,count(username) from v$session where username is not null group by username,machine;
--查看鏈接的進程 sid,serial#
select sid,serial#,username,status,osuser from v$session;
--查看客戶端登錄的ip地址:
select sys_context('userenv','ip_address') from dual;
--在生產數據庫中建立一個追蹤客戶端ip地址的觸發器:
create or replace trigger on_logon_trigger after logon on database begin dbms_application_info.set_client_info(sys_context('userenv','ip_address')); end;
--查詢當前日期
select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
--查看有哪些用戶鏈接
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
--查看當前有哪些用戶正在使用數據
select osuser,a.username,cpu_time/executions/1000000||'s',sql_fulltext,machine from v$session a,v$sqlarea b where a.sql_address=b.address order by cpu_time/executions desc;
--監控當前數據庫誰在運行什麼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 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='&v_hostname' or username='wacos';
--如何查出前臺正在發出的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語句:
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
select sql_text from v$sqlarea where address='000000038fcb1a90';
--根據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 = &v_sid);
--根據sid查看對應鏈接的資源佔用等狀況
select n.name,v.value,n.class,n.statistic# from v$statname n,v$sesstat v where v.sid=&v_sid and v.statistic#=n.statistic# order by n.class,n.statistic#
--根據sid查是哪臺電腦的連接
column osuser format a15 column username format a10 column machine format a30 select osuser,machine,username,sid,serial# from v$session where sid='&v_sid';
--根據sid查對應的sql
select sid,sql_text from v$open_cursor where sid=&v_sid;
--根據sid找oracle的某個進程:
select pro.spid from v$session ses,v$process pro where ses.sid=&v_sid and ses.paddr=pro.addr;
--當前會話的sid,serial#
select sid,serial# from v$session where audsid = sys_context('userenv','sessionid');
--找到與所鏈接的會話有關的當前等待事件:
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;
--等待時間最多的5個系統等待事件的獲取:
select * from ( select * from v$system_event where event not like 'sql%' order by total_waits desc) where rownum<=5;
--查看當前等待事件的會話:
col username format a10 set line 120 col event format a30 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%';
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';
查會話的阻塞
col user_name format a32 select /* rule */ lpad('',decode(l.xidusn,0,3,0))||l.oracle_username user_name,o.owner,o.object_name,s.sid,s.serial# from v$locked_object l,dba_objects o,v$session s where l.object_id=o.object_id and l.session_id=s.sid order by o.object_id,xidusn desc;
col username format a15 col lock_level format a8 col owner format a18 col object_name format a32 select /* rule */ s.username,decode(l.type,'tm','table lock','tx','row lock',null) lock_level, o.owner,o.object_name,s.sid,s.serial# from v$session s,v$lock l,dba_objects o where l.sid=s.sid and l.id1=o.object_id and s.username is not null;
--求等待的事件及會話信息/求會話的等待及會話信息
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%' order by s.username;
select s.sid,s.username,sw.event,sw.wait_time,sw.state,sw.seconds_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 s.username;
--求會話等待的file_id/block_id
col event format a24 col p1text format a12 col p2text format a12 col p3text format a12 select sid,event,p1text,p1,p2text,p2,p3text,p3 from v$session_wait where event not like '%sql%' and event not like '%rdbms%' and event not like '%mon%' order by event;
select name,wait_time from v$latch l where exists( select 1 from ( select sid,event,p1text,p1,p2text,p2,p3text,p3 from v$session_wait where event not like '%sql%' and event not like '%rdbms%' and event not like '%mon%') x where x.p1 = l.latch#);
--求會話等待的對象
col owner format a18 col segment_name format a32 col segment_type format a32 select owner, segment_name, segment_type from dba_extents where file_id = &file_id and &block_id between block_id and block_id + blocks - 1;
--殺會話的腳本:
select a.sid,b.spid,a.serial#,a.lockwait,a.username,a.osuser,a.logon_time,a.last_call_et/3600 last_hour,a.status, 'orakill'||sid||''||spid host_command,'alter system kill session'''||a.sid||','||a.serial#||'''' sql_command from v$session a,v$process b where a.paddr=b.addr and sid>6;
--鎖相關的表
select * from v$lock; select * from v$sqlarea; select * from v$session; select * from v$process ; select * from v$locked_object; select * from all_objects; select * from v$session_wait;
--查看數據庫中的表鎖
--查找某個表被哪一個session鎖定
select a.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 from all_objects a,v$locked_object b,sys.gv_$session c where(a.object_id = b.object_id) and(b.process = c.process) order by 1,2;
--數據庫的鎖表與解鎖
select /*+ rule */ s.username,decode(l.type,'tm','table lock','tx','row lock',null) lock_level, o.owner,o.object_name,o.object_type,s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser from v$session s,v$lock l,dba_objects o where l.sid = s.sid and l.id1 = o.object_id(+) and s.username is not null --kill session語句 alter system kill session'50,492';
--分步
--1.查出鎖定object的session的信息以及被鎖定的object名 select l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time from v$locked_object l, all_objects o, v$session s where l.object_id = o.object_id and l.session_id = s.sid order by sid, s.serial# ; --2.查出鎖定表的session的sid, serial#,os_user_name, machine name, terminal和執行的語句 --比上面那段多出sql_text和action select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#, l.os_user_name,s.machine, s.terminal,a.sql_text, a.action from v$sqlarea a,v$session s, v$locked_object l where l.session_id = s.sid and s.prev_sql_addr = a.address order by sid, s.serial#; --3.查出鎖定表的sid, serial#,os_user_name, machine_name, terminal,鎖的type,mode select s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine, s.terminal, s.logon_time, l.type from v$session s, v$lock l where s.sid = l.sid and s.username is not null order by sid;
/*這個語句將查找到數據庫中全部的dml語句產生的鎖,還能夠發現,
任何dml語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
殺鎖命令*/
/*若是發生了鎖等待,咱們可能更想知道是誰鎖了表而引發誰的等待
如下的語句能夠查詢到誰鎖了表,而誰在等待。
以上查詢結果是一個樹狀結構,若是有子節點,則表示有等待發生。
若是想知道鎖用了哪一個回滾段,還能夠關聯到v$rollname,其中xidusn就是回滾段的usn*/
col user_name format a10 col owner format a10 col object_name format a10 col object_type format a10 select /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name, o.owner,o.object_name,o.object_type,s.sid,s.serial# from v$locked_object l,dba_objects o,v$session s where l.object_id=o.object_id and l.session_id=s.sid order by o.object_id,xidusn desc
--分步
--1.查哪一個過程被鎖: --查v$db_object_cache視圖: select * from v$db_object_cache a where a.owner='gseoprod' and a.locks != '0'; --2. 查是哪個sid,經過sid可知道是哪一個session: --查v$access視圖: select * from v$access where owner='過程的所屬用戶' and name='剛纔查到的過程名'; --3. 查出sid和serial#: --查v$session視圖: select sid,serial#,paddr from v$session where sid='剛纔查到的sid'; --查v$process視圖: select spid from v$process where addr='剛纔查到的paddr'; --4. 殺進程: --(1)先殺oracle進程: alter system kill session '&v_sid,&v_serial#'; --(2)再殺操做系統進程: --kill -9 剛纔查出的spid或orakill 剛纔查出的sid 剛纔查出的spid。
--查看是否有鎖表的sql
select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text blockers, 'waiter ('||lw.sid||':'||sw.username||')-sql:'|| qw.sql_text waiters from v$lock lb, v$lock lw, v$session sb, v$session sw, v$sql qb, v$sql qw where lb.sid=sb.sid and lw.sid=sw.sid and sb.prev_sql_addr=qb.address and sw.sql_address=qw.address and lb.id1=lw.id1 and sw.lockwait is not null and sb.lockwait is null and lb.block=1 ;
/*
session_id擁有鎖的session_id,username擁有鎖的username,mode_held鎖的執行模式mode_held,
mode_requested鎖的請求mode_requested,object_name鎖所在的數據庫對象名
,lock_type鎖的類型,lock_id鎖的id
*/
select s.sid session_id, s.username, decode(lmode, 0, 'none', 1, 'null', 2, 'row-s (ss)', 3, 'row-x (sx)', 4, 'share', 5, 's/row-x (ssx)', 6, 'exclusive', to_char(lmode)) mode_held, decode(request, 0, 'none', 1, 'null', 2, 'row-s (ss)', 3, 'row-x (sx)', 4, 'share', 5, 's/row-x (ssx)', 6, 'exclusive', to_char(request)) mode_requested, o.owner||'.'||o.object_name||' ('||o.object_type||')', s.type lock_type, l.id1 lock_id1, l.id2 lock_id2 from v$lock l, sys.dba_objects o, v$session s where l.sid = s.sid and l.id1 = o.object_id;
--查看被鎖的表
select p.spid,a.serial#,c.object_name, b.session_id,b.oracle_username,b.os_user_name from v$process p,v$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id ;
--處理存儲過程被鎖
--查找鎖定過程的sid
select * from v$access where owner=<object owner> and object=<procedure name>;
--查看鎖(lock)狀況:
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;
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;
--查看那個用戶那個進程形成死鎖,鎖的級別
select b.owner,b.object_name,l.session_id,l.locked_mode from v$locked_object l, dba_objects b where l.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 'sid,serial#';
--若是有ora-00031錯誤,則在後面加immediate;
alter system kill session '29,5497' immediate;
--形成等待的lock的信息,好比lock類型等:
col event format a30 set line 160 col machine format a10 col username format a15 select b.sid,b.serial#,b.username,machine,a.event,a.wait_time, chr(bitand(a.p1,-16777216)/16777215)||chr(bitand(b.p1,16711680)/65535) "enqueue type" from v$session_wait a,v$session b where a.event not like 'sql*n%' and a.event not like 'rdbms%' and a.sid=b.sid and b.sid>8 and a.event='enqueue' order by username;
--數據庫鎖對象
set line 120 column object_name format a32 column os_user_name format a12 column orauser format a12 column sql_text format a32 column serial# format 999999 column sid format 99999 select os_user_name,oracle_username as orauser,s.sid,o.object_name,o.object_type,s.serial#,a.sql_text from v$locked_object l,dba_objects o,v$session s,v$sqlarea a where l.object_id=o.object_id and s.sql_address=a.address and l.session_id=s.sid;
select'alter system kill session'''||to_char(s.sid)||','||to_char(s.serial#)||''';' as "statement to kill" from v$locked_object l,dba_objects o,v$session s where l.object_id=o.object_id and l.session_id=s.sid;
--以dba角色,查看當前數據庫裏鎖的狀況能夠用以下sql語句:
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;
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;
select sql_address from v$session where sid=&v_sid; select * from v$sqltext where address=&v_address; select command_type,piece,sql_text from v$sqltext where address=(select sql_address from v$session a where sid=&v_sid); select object_id from v$locked_object; select object_name,object_type from dba_objects where object_id=&v_object_id;
--若是有長期出現的一列,多是沒有釋放的鎖。咱們能夠用下面sql語句殺掉長期沒有釋放非正常的鎖:
alter system kill session'sid,serial#';
--以dba角色,查看當前數據庫裏鎖的狀況:
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;
--查看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 999999 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
--查看等待(wait)狀況
select ws.class,ws.count count,sum(ss.value)sum_value from v$waitstat ws,v$sysstat ss where ss.name in ('db block gets','consistent gets') group by ws.class,ws.count;
--檢查average_wait執行:
select event,total_waits,time_waited,average_wait from v$system_event where event like '%undo%';
--求process/session的狀態
select p.pid,p.spid,s.program,s.sid,s.serial# from v$process p,v$session s where s.paddr=p.addr;
--求誰阻塞了某個session(10g)
select sid,username,event,blocking_session,seconds_in_wait,wait_time from v$session where state in ('waiting') and wait_class!='idle';
--如何查看一下某個shared_server正在忙什麼:
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;
--查看當前sga值:
select * from v$sga
--查看各項sga相關參數:sga,sgastat
select substr(name,1,10) name,substr(value,1,10) value from v$parameter where name='log_buffer'; select * from v$sgastat ; select * from v$sga;
show parameters area_size --查看 各項區域內存參數, 其中sort_area爲排序參數用;
--各項視圖建議參數值:v$db_cache_advice、v$shared_pool_advice),關於pga也有相關視圖v$pga_target_advice 等。
--監控 sga 的命中率
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 中字典緩衝區的命中率
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;
--監控字典緩衝區
select (sum(pins-reloads))/sum(pins) "lib cache" from v$librarycache; select (sum(gets-getmisses-usage-fixed))/sum(gets) "row cache" from v$rowcache; select sum(pins) "executions",sum(reloads) "cache misses while executing" from v$librarycache;
--(後者除之前者,此比率小於1%,接近0%爲好)
select sum(gets) "dictionary gets",sum(getmisses) "dictionary cache get misses" from v$rowcache;
--監控 sga 中共享緩存區的命中率,應該小於1%
select sum(pins) "total pins",sum(reloads) "total reloads",sum(reloads)/sum(pins)*100 libcache from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent" from v$librarycache;
--監控 sga 中重作日誌緩存區的命中率,應該小於1%
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$latch where name in ('redo allocation','redo copy');
--監控 mts
select busy/(busy+idle) "shared servers busy" from v$dispatcher;--(此值大於0.5時,參數需加大) select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; select count(*) from v$dispatcher; select servers_highwater from v$mts; --(servers_highwater接近mts_max_servers時,參數需加大)
--db_cache建議
select size_for_estimate,buffers_for_estimate,estd_physical_read_factor,estd_physical_reads from v$db_cache_advice where name='default' and block_size =(select value from v$parameter where name='db_block_size') and advice_status ='on';
/*內存使用鎖定在物理內存:
aix 5l(aix 4.3.3 以上)
logon aix as root
cd /usr/samples/kernel
./vmtune(信息以下)v_pingshm已是1
./vmtune -s 1
而後oracle用戶修改initsid.ora 中 lock_sga = true
從新啓動數據庫
hp unix
root身份登錄
create the file "/etc/privgroup": vi /etc/privgroup
add line "dba mlock" to file
as root,run the command "/etc/setprivgrp -f /etc/privgroup":
$/etc/setprivgrp -f /etc/privgroup
oracle用戶修改initsid.ora中lock_sga=true
從新啓動數據庫
solaris(solaris2.6以上)
8i版本以上數據庫默認使用隱藏參數 use_ism = true ,自動鎖定sga於內存中,不用設置
lock_sga,若是設置 lock_sga =true 使用非 root 用戶啓動數據庫將返回錯誤。
windows (做用不大)
不能設置lock_sga=true,能夠經過設置pre_page_sga=true,使得數據庫啓動的時候就把全部內
存頁裝載,這樣可能起到必定的做用。
數據庫的硬件配置:cpu、內存、網絡條件
1.cpu:在任何機器中cpu的數據處理能力每每是衡量計算機性能的一個標誌,而且oracle是一個提供並行能力的數據庫系統,在cpu方面的要求就更高了,若是運行隊列數目超過了cpu處理的數目,性能就會降低,咱們要解決的問題就是要適當增長cpu的數量了,固然咱們還能夠將須要許多資源的進程kill掉;
2.內存:衡量機器性能的另一個指標就是內存的多少了,在oracle中內存和咱們在建數據庫中的交換區進行數據的交換,讀數據時,磁盤i/o必須等待物*/
--共享內存的使用率
select round(bytes/1024/1024,2)||'m' free_memory,round(total/1024/1024,2)||'m' as total_memory, (1-round(bytes/total,2))*100||'%' as used_ratio from v$sgastat, (select pool,sum(bytes) as total from v$sgastat where pool='shared pool' group by pool) b where name='free memory' and b.pool=v$sgastat.pool and v$sgastat.pool='shared pool';
--分步執行獲取使用率
--共享內存的大小:
select round(sum(bytes)/1024/1024,2) from v$sgastat where pool='shared pool';
--查詢空閒的共享池內存:
select * from v$sagstat where name ='free memory' and pool ='shared pool';
--共享池內存使用率
select (1-round(bytes/(&tsp_in_m * 1024 * 1024),2))*100||'%' from v$sgastat where name='free memory' and pool='shared pool';
--其中: &tsp_in_m是你的總的共享池的size(m)
--共享池內存使用率,應該穩定在75%-90%間,過小浪費內存,太大則內存不足。
--肯定高速緩衝區命中率:(若是命中率低於70%,則應該加大init.ora參數中的db_block_buffer的值)
select 1-sum(decode(name,'physical reads',value,0))/ (sum(decode(name,'db block gets',value,0))+sum(decode(name,'consistent gets',value,0))) hit_ratio from v$sysstat t where name in ('physical reads','db block gets','consistent gets')
--數據庫共享池性能檢查:
select namespace,gets,gethitratio,pins,pinhitratio,reloads,invalidations from v$librarycache where namespace in ('sqlarea','table/procedure','body','trigger');
--library cache的命中率計算
--計算公式:
--library cache hit ratio = sum(pinhits)/sum(pins)
--select sum(pinhits)/sum(pins) from v$librarycache;
--一般在98%以上,不然,須要要考慮加大共享池,綁定變量,修改cursor_sharing等參數。
/*共享池的命中率 (若是ratio1大於1時,須要加大共享池,若是ratio2大於10%時,須要加大共享池shared_pool_size)
假如共享池的命中率低於95%,就要考慮調整應用(一般是沒使用bind var )或者增長內存*/
select sum(pinhits-reloads)/sum(pins)*100 "hit radio" from v$librarycache;
--假如共享池的命中率低於95%,就要考慮調整應用(一般是沒使用bind var )或者增長內存;
select sum(pinhits)/sum(pins)*100 "hit radio" from v$librarycache; select sum(pins)pins,sum(reloads)reloads,(sum(reloads)/sum(pins))*100 ratio1 from v$librarycache select sum(gets)gets,sum(getmisses)getmisses,(sum(getmisses)/sum(gets))*100 ratio2 from v$rowcache
--查詢init.ora參數:
select * from v$parameter
--db buffer cache命中率
--計算公式:
--hit ratio = 1-[physical reads/(block gets+consistent gets)]
select name,physical_reads,db_block_gets,consistent_gets,1-(physical_reads/(db_block_gets+consistent_gets)) "hit ratio" from v$buffer_pool_statistics where name='default';
--一般應在90%以上,不然,須要調整,加大db_cache_size。
--另一種buffer cache計算命中率的方法:
/*命中率的計算公式爲:
hit ratio=1-((physical reads-physical reads direct-physical reads direct(lob))/
(db block gets+consistent gets-physical reads direct-physical reads direct(lob))*/
select round((1-((physica_reads-physical_reads_direct-physical_reads_direct_lob)/ (db_block_gets+consistent_gets-physical_reads_direct-physical_reads_direct_lob)))*100,2)||'%' as hit_ratio from ( select sum(case name when 'session logical reads' then value else null end) session_logical_reads, sum(case name when 'db block gets' then value else null end) db_block_gets, sum(case name when 'consistent gets' then value else null end) consistent_gets, sum(case name when 'physical reads' then value else null end) physica_reads, sum(case name when 'physical reads direct' then value else null end) physical_reads_direct, sum(case name when 'physical reads direct(lob)' then value else null end) physical_reads_direct_lob from v$sysstat where name in ('session logical reads','physical reads','physical reads direct','physical reads direct(lob)', 'db block gets','consistent gets') )
--分步執行獲取命中率
select name,value from v$sysstat where name in ('session logical reads','physical reads','physical reads direct', 'physical reads direct(lob)','db block gets','consistent gets');
--數據緩衝區命中率
select value from v$sysstat where name='physical reads'; select value from v$sysstat where name='physical reads direct'; select value from v$sysstat where name='physical reads direct(lob)'; select value from v$sysstat where name='consistent gets'; select value from v$sysstat where name='db block gets';
--這裏命中率的計算應該是令 x=physical reads direct+physical reads direct(lob)
--命中率=100-(physical reads-x)/(consistent gets+db block gets-x)*100
--一般若是發現命中率低於90%,則應該調整應用可能夠考慮是否增大數據緩衝區
--檢查rbs header get ratio執行:
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%)
--監控內存和硬盤的排序比率,最好使它小於 .10,增長 sort_area_size
select name,value from v$sysstat where name in ('sorts(memory)','sorts(disk)');
--命中排序域的次數:
select t.name,t.value from v$sysstat t where t.name like 'sort%'
--假如咱們發現sorts(disk)/(sorts(memory)sorts(disk))的比例太高,則一般意味着sort_area_size 部份內存較小,可考慮調整相應的參數。
--查看排序段的性能:
select name,value from v$sysstat where name in ('sorts(memory)','sorts(disk)');
--查看排序多的sql
select sql_text,sorts,parsing_schema_name from v$sqlarea order by sorts desc;
--查看執行次數多的sql
select sql_text,executions,parsing_schema_name from v$sqlarea order by executions desc;
/*說明:單純從v$sqlarea中是沒法查出每一個sql消耗的內存量的,但咱們能夠藉助磁盤讀次數間接反映可能的消耗內存量較大的sql語句,
而後再借助執行計劃(如v$sql_plan視圖)具體查看。
利用系統視圖v$sqlarea,其中disk_reads是磁盤讀次數,也是主要字段,剩餘字段均爲參考字段。
其中,buffer_gets是內存讀次數,parsing_schema_name是首次編譯者模式名(通常與user名相同),executions是語句執行次數。
須要注意的是,v$sqlarea中sql_text可能不完整,若須要完整的則須要藉助hash_value或sql_id結合v$sqltext來查看分析。*/
--根據pid查找相應的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='orcl' and b.addr=a.paddr and a.sql_address=c.address(+) order by c.piece
--log_buffer
select name,value from v$sysstat where name in ('redo entries','redo buffer allocation retries');
--假如 redo buffer allocation retries/ redo entries 的比例超過1%咱們就能夠考慮增大log_buffer
--查詢消耗資源的進程(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
--求出某個進程,並對它進行跟蹤
select s.sid,s.serial# from v$session s,v$process p where s.paddr = p.addr and p.spid = &1;
exec dbms_system.set_sql_trace_in_session(&1,&2,true);
exec dbms_system.set_sql_trace_in_session(&1,&2,false);
--求當前session的跟蹤文件
select p1.value||'/'||p2.value||'_ora_'||p.spid||'.ora' filename from v$process p,v$session s,v$parameter p1,v$parameter p2 where p1.name='user_dump_dest' and p2.name='instance_name' and p.addr=s.paddr and s.audsid=userenv('sessionid') and p.background is null and instr(p.program,'cjq')=0;
--查詢session的os進程id
select p.spid "os thread",b.name "name-user",s.program,s.sid,s.serial#,s.osuser,s.machine from v$process p,v$session s,v$bgprocess b where p.addr=s.paddr and p.addr=b.paddr and(s.sid=&1 or p.spid=&1) union all select p.spid "os thread",s.username "name-user",s.program,s.sid,s.serial#,s.osuser,s.machine from v$process p,v$session s where p.addr=s.paddr and(s.sid=&1 or p.spid=&1) and s.username is not null;
--查找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='&obj' order by s.username,s.osuser
--查看object_catched
select owner,name,db_link,namespace,type,sharable_mem,loads,executions,locks,pins,kept from v$db_object_cache
--求出鎖定的對象
select do.object_name,session_id,process,locked_mode from v$locked_object lo,dba_objects do where lo.object_id=do.object_id;
--檢查誰lock了什麼對象:
set line 200 col "o/s-user" format a10 col "ora-user" format a10 col "obj locked" format a30 select /*+rule*/s.machine,s.osuser "o/s-user",s.username "ora-user",s.sid "session-id",s.serial# "serial", s.process "process-id",s.status "status",l.name "obj locked",l.mode_held "lock mode" from v$session s,dba_dml_locks l,v$process p where l.session_id=s.sid and p.addr=s.paddr
--查看數據庫庫對象
select owner,object_type,status,count(*) count# from all_objects group by owner,object_type,status;
--顯示全部數據庫對象的類別和大小
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;
--查詢disk_reads大於100000的sql查詢
select b.username username,a.disk_reads reads, a.executions exec,a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio, a.sql_text statement from v$sqlarea a,dba_users b where a.parsing_user_id=b.user_id and a.disk_reads>100000 order by a.disk_reads desc;
--運行時間長的的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語句
select b.username username,a.buffer_gets buffer_gets,a.executions exec,a.sql_text statement from v$sqlarea a,dba_users b where a.parsing_user_id=b.user_id order by a.buffer_gets desc;
--v$sql是內存共享sql區域中已經解析的sql語句。查出使用頻率最高的5個查詢:
select sql_text,executions from (select sql_text,executions,rank() over(order by executions desc) exec_rank from v$sql) where exec_rank <=5;
--消耗磁盤讀取最多的sql top5:
select disk_reads,sql_text from (select sql_text,disk_reads,dense_rank() over(order by disk_reads desc) disk_reads_rank from v$sql) where disk_reads_rank <=5;
select * from ( select parsing_user_id,executions,sorts,command_type,disk_reads,sql_text from v$sqlarea order by disk_reads) d where rownum<10
--找出須要大量緩衝讀取(邏輯讀)操做的查詢:
select buffer_gets,sql_text from (select sql_text,buffer_gets,dense_rank() over(order by buffer_gets desc) buffer_gets_rank from v$sql) where buffer_gets_rank<=5;
--經過v$session_wait這個視圖查看性能問題的成因,看系統的這些session在等什麼,使用了多少的io。
--查看佔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
/*對檢索出的結果的幾點說明:
一、我是按每一個正在等待的session已經發生的物理讀排的序,由於它與實際的io相關。
二、你能夠看一下這些等待的進程都在忙什麼,語句是否合理? */
select sql_address from v$session where sid=&v_sid;
select * from v$sqltext where address=&v_address;
--執行以上兩個語句即可以獲得這個session的語句。 kill進程
alter system kill session'sid,serial#';
/*三、應觀注一下event這列,這是咱們調優的關鍵一列,下面對常出現的event作以簡要的說明:
a、buffer busy waits,free buffer waits這兩個參數所標識是dbwr是否夠用的問題,與io很大相關的,
當v$session_wait中的free buffer wait的條目很小或沒有的時侯,說明你的系統的dbwr進程決對夠用,不用調整;
free buffer wait的條目不少,你的系統感受起來必定很慢,這時說明你的dbwr已經不夠用了,它產生的wio已經成爲你的數據庫性能的瓶頸,這時的解決辦法以下:
a、1增長寫進程,同時要調整db_block_lru_latches參數
示例:修改或添加以下兩個參數
db_writer_processes=4
db_block_lru_latches=8
2開異步io,ibm這方面簡單得多,hp則麻煩一些,能夠與hp工程師聯繫。
b、db file sequential read,指的是順序讀,即全表掃描,這也是咱們應該儘可能減小的部分,
解決方法就是使用索引、sql調優,同時能夠增大db_file_multiblock_read_count這個參數。
c、db file scattered read,這個參數指的是經過索引來讀取,一樣能夠經過增長db_file_multiblock_read_count這個參數來提升性能。
d、latch free,與栓相關的了,須要專門調節。
e、其餘參數能夠不特別觀注。
*/
/*計算cpu消耗首先要藉助linux的top命令尋找cpu使用量高的session,找到高佔用的pid。
而後藉助v$process的addr字段跟v$session的paddr找到sql_id、hash_value,
而後結合v$sqltext而後找相應的sql語句,找到以後分析執行計劃,進行相應調優。*/
--前30條平均cpu時間超過10秒的sql
select a.address address,b.cpu_time/1000000/b.executions averagecputime,b.cpu_time/1000000 cputime, b.elapsed_time/1000000 elapsedtime,b.executions executions,a.sql_text sqltext from v$sqltext a,v$sqlarea b where a.address=b.address and a.hash_value=b.hash_value and b.executions>0 and(b.address,b.hash_value) in (select address,hash_value from ( select address,hash_value from v$sqlarea where executions>0 and cpu_time/1000000>10*executions order by cpu_time desc) where rownum<31) group by a.address,a.sql_text,a.piece,b.cpu_time,b.elapsed_time,b.executions order by averagecputime desc,a.address,a.piece;
--找出消耗cpu最高的進程對應的sql語句 (這裏輸入佔用cpu最高的進程對應的pid):
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" 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'%&v_pid%';
set termout off spool maxcpu.txt 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'%&v_pid%';
--enter value for 1: pid(這裏輸入佔用cpu最高的進程對應的pid)
--spool off(這句放在最後執行)
--找使用cpu多的用戶session
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)
--cpu用率最高的2條sql語句的獲取
--執行:top,經過top得到cpu佔用率最高的進程的pid。
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.hash_value=v$session.sql_hash_value and v$session.paddr=v$process.addr and v$process.spid in (&v_pid);
col machine format a30 col program format a40 set line 200 select sid,serial#,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') from v$session where paddr in (select addr from v$process where spid in (&spid));
select sql_text from v$sqltext_with_newlines where hash_value=(select sql_hash_value from v$session where sid=&sid) order by piece;
--查找消耗資源的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 操做系統pid
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.hash_value=v$session.sql_hash_value and v$session.paddr=v$process.addr and v$process.spid in (&v_pid);
----------------------------------------
--查看v$sqlarea
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_calls,disk_reads,buffer_gets,rows_processed from v$sqlarea
--------------------------------------------------------------------------------
/*v$sqlarea
v$sql和v$sqlarea基本相似,而v$sqlarea更經常使用,故僅對v$sqlarea經常使用字段進行說明,以下(我的參考oracle官方文檔翻譯的,因是最新版本,因此會跟網絡上的有些出入):
sql_text:sql語句的前1000個字符;
sql_fulltext:sql語句的全部字符;
sql_id:緩存在高速緩衝區(library cache)中的sql父遊標的惟一標識id(注,相似於hash_value,不過hash_value是4bytes而sql_id是8bytes,sql_id更精確後期可能會替代hash_value);
sharable_mem:sql語句及其子游標占用的共享內存大小;
persistent_mem:打開sql語句的生命週期內所佔用的固定內存大小(包含子游標);
runtime_mem:遊標執行期間所佔用的固定內存大小;
sorts:語句執行致使的排序次數;
version_count:在緩存中以該語句爲父語句的子游標總數;
loaded_versions:緩存中載入了這條語句上下文堆(kgl heap 6)的子游標數;
open_versions:父遊標下打開的子游標個數;
users_opening:打開子游標的用戶個數;
fetches:sql語句的fetch數;
executions:包含全部子游標在內該sql語句共執行次數;
users_executing:執行過該語句全部子游標的用戶總數;
loads:語句被載入的總次數;
first_load_time:父遊標被首次載入(編譯)的時間;
parse_calls:父遊標下全部子游標解析調用次數;
disk_reads:該語句經過全部子游標緻使的讀磁盤次數;
direct_writes:該語句經過全部子游標緻使的直接寫入次數;
buffer_gets:該語句經過全部子游標緻使的讀緩存次數;
application_wait_time:應用等待時間;
user_io_wait_time:用戶i/o等待時間;
plsql_exec_time:plsql執行時間;
rows_processed:該sql語句處理的總行數;
optimizer_cost:此查詢優化給出的成本數;
parsing_user_id:第一次解析該父語句的用戶id;
parsing_schema_id:第一次解析該語句schema的id;
parsing_schema_name:解析該語句的schema的name;
kept_versions:指出是否當前子游標被使用dbms_shared_pool包標記爲常駐內存;
address:當前遊標父句柄(惟一指向該遊標的一種地址編號);
hash_value:該語句在library cache中hash值;
plan_hash_value:執行計劃的hash值,可依此肯定兩個執行計劃是否相同(取代每行每字符進行比較的方式);
cpu_time:該語句解析、執行和fetch(取值)所消耗的cpu時間;
elapsed_time:該語句解析、執行和fetch(取值)所通過的時間;
last_active_time:查詢計劃最後一次執行的時間;
locked_total:全部子游標被鎖的次數;
v$sqltext
address:當前遊標父句柄(惟一指向該遊標的一種地址編號);
hash_value:該遊標(子游標)在library cache中惟一hash值;
sql_id:緩存遊標中該sql的一個惟一標識值;
command_type:sql語句類型,如select、insert、update等;
piece:排序sql文本的碎片數;
sql_text:包含一個完整sql中的某一小塊sql文本字符(要完整的sql語句須要把這些碎片組合起來);
v$session
saddr:session地址;sid:session標識值,常跟serial#聯合惟一肯定一個session(在殺進程時,有時sid會重用,形成誤殺。而serial會增長但不會重複,sid 在同一個instance的當前session中是一個unique key,而sid ,serial#則是在整個instance生命期內的全部session中是unique key);serial#:會話序列號,用於在一個會話結束而另外一個會話重用這該會話的sid時,惟一肯定一個會話;audsid:審計會話id,能夠經過audsid查詢當前session的sid,select sid from v$session where audsid=userenv('sessionid');paddr:進程地址,關聯v$process的addr字段,經過這個能夠查詢到進程對應的session;user#:同於dba_users中的user_id,oracle內部進程user#爲0;username:會話擁有者用戶名,等於dba_users中的username,oracle內部進程的username爲空;command:正在執行的sql語句類型,如1爲create table、3爲select等;ownerid:若是該列值爲2147483644則值無效,不然值用於會話遷移、並行等;taddr:address of transaction state object;lockwait:標識當前查詢是否處於鎖等待狀態,爲空則表示無等待;status:標識session狀態,active正執行sql語句,inactive等待操做,killed被標註爲殺死;server:服務器類型,dedicated專用、shared共享等;schema#:schema標識id值,oracle內部進程的schema#爲0;schemaname:schema用戶名,oracle內部進程的爲sys;osuser:客戶端操做系統用戶名;process:客戶端操做系統進程id;machine:操做系統機器名;terminal:操做系統終端名;program:操做系統應用程序名,如exe或sqlplus.exe;type:會話類型,如background或user;sql_address:和sql_hash_value一塊兒使用標識正在執行的sql語句;sql_hash_value:和sql_address一塊兒使用標識正在執行的sql語句;sql_id:正在執行的sql語句的標識id;sql_child_number:正在執行的sql語句的子id;fixed_table_sequence:當session完成一個user call後就會增長的一個數值,也就是說,若是session掛起,它就不會增長。所以能夠根據這個字段來監控某個時間點以來的session性能狀況。例如,一個小時前某個session的此字段數值爲10000,而如今是20000,則代表一個小時內其user call較頻繁,能夠重點關注此session的performance statistics。row_wait_obj#:被鎖定行所在table的object_id,和dba_object中的object_id關聯能夠獲得被鎖定的table name;row_wait_file#:被鎖定行所在的datafile id,和v$datafile中的file#關聯能夠獲得datafile name;row_wait_block#:被鎖定的塊id;row_wait_row#:被鎖定的當前行;logon_time:登陸時間;*/