效能分析SQL

jss001發表於2009-02-27
-用於檢視哪些例項的哪些操作使用了大量的臨時段
  
  SELECT to_number(decode(SID, 65535, NULL, SID)) sid,
  operation_type OPERATION,trunc(EXPECTED_SIZE/1024) ESIZE,
  trunc(ACTUAL_MEM_USED/1024) MEM, trunc(MAX_MEM_USED/1024) "MAX MEM",
  NUMBER_PASSES PASS, trunc(TEMPSEG_SIZE/1024) TSIZE
  FROM V$SQL_WORKAREA_ACTIVE
  ORDER BY 1,2;
  
  ---查詢有熱塊查詢的SQL語句
  
  select hash_value
  from v$sqltext a,
  (select distinct a.owner,a.segment_name,a.segment_type from
  dba_extents a,
  (select dbarfil,dbablk
  from (select dbarfil,dbablk
  from x$bh order by tch desc) where rownum < 11) b
  where a.RELATIVE_FNO = b.dbarfil
  and a.BLOCK_ID <= b.dbablk and a.block_id + a.blocks > b.dbablk) b
  where a.sql_text like '%'||b.segment_name||'%' and b.segment_type = 'TABLE'
  order by a.hash_value,a.address,a.piece;
  
  --全表掃描
  
  select opname,target,b.num_rows,b.tablespace_name,count(target) from v$session_longops a,all_all_tables b
  where a.TARGET=b.owner||'.'||b.table_name
  having count(target)>10 group by  opname,target,b.num_rows,b.tablespace_name
  
  --檢視磁碟排序和快取排序次數
  
  select to_char(sn.snap_time,'yyyy-mm-dd hh24') time_,
  avg(newmen.value - oldmen.value) sorts_memeory,
  avg(newdsk.value - olddsk.value) disk_sort
  from  stats$sysstat oldmen,
  stats$sysstat newmen,
  stats$sysstat newdsk,
  stats$sysstat olddsk,
  stats$snapshot sn
  where  newdsk.snap_id=sn.snap_id
  and   olddsk.snap_id=sn.snap_id-1
  and   newmen.snap_id=sn.snap_id
  and   newdsk.snap_id=sn.snap_id -1
  and   oldmen.name='sorts (memory)'
  and   newmen.name='sorts (memory)'
  and   olddsk.name='sorts (disk)'
  and   newdsk.name='sorts (disk)'
  group by to_char(sn.snap_time,'yyyy-mm-dd hh24')
  
  --執行最慢的前10個SQL???
  
  select * from (
  select
  to_char(snap_time,'dd Mon HH24:mi:ss') mydate,
  executions               exec,
  loads                 loads,
  parse_calls              parse,
  disk_reads               reads,
  buffer_gets              gets,
  rows_processed             rows_proc,
  sorts                 sorts,
  sql_text,
  hash_value
  from
  perfstat.stats$sql_summary sql,
  perfstat.stats$snapshot   sn
  where
  sql.snap_id >
  (select min(snap_id) min_snap
  from stats$snapshot where snap_time > sysdate-$days_back)
  and
  sql.snap_id = sn.snap_id
  order by $sortskey desc) tt where rownum<11;
  
  --SQL快取池的命中率查詢(pinhitratio,gethitratio應該大於90%以上)
  
  select namespace,gethitratio,pinhitratio,reloads,invalidations
  from v$librarycache
  where namespace in ('SQL AREA','TABLE/PROCEDURE','BODY','TRIGGER')
  
  --資料庫的常規引數我就不說了,除了V$parameter中的常規引數外,ORACLE還有大量的隱含引數,下面的語句就可以查詢到資料庫的所有隱含引數以及其值與引數的描述。
  
  SELECT NAME
  ,VALUE
  ,decode(isdefault, 'TRUE','Y','N') as "Default"
  ,decode(ISEM,'TRUE','Y','N') as SesMod
  ,decode(ISYM,'IMMEDIATE', 'I',
  'DEFERRED', 'D',
  'FALSE', 'N') as SysMod
  ,decode(IMOD,'MODIFIED','U',
  'SYS_MODIFIED','S','N') as Modified
  ,decode(IADJ,'TRUE','Y','N') as Adjusted
  ,description
  FROM ( --GV$SYSTEM_PARAMETER
  SELECT x.inst_id as instance
  ,x.indx+1
  ,ksppinm as NAME
  ,ksppity
  ,ksppstvl as VALUE
  ,ksppstdf as isdefault
  ,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM
  ,decode(bitand(ksppiflg/65536,3),
  1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM
  ,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD
  ,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ
  ,ksppdesc as DESCRIPTION
  FROM x$ksppi x
  ,x$ksppsv y
  WHERE x.indx = y.indx
  AND substr(ksppinm,1,1) = '_'
  AND x.inst_id = USERENV('Instance')
  )
  ORDER BY NAME
  
  --想知道現在哪個使用者正在利用臨時段嗎?這個語句將告訴你哪個使用者正在利用臨時段。
  
  SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, a.sid, a.serial#,
  a.username, a.osuser, a.status,c.sql_text
  FROM v$session a,v$sort_usage b, v$sql c
  WHERE a.saddr = b.session_addr
  AND a.sql_address = c.address(+)
  ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks;
  
  --檢視磁碟碎片
  
  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
  
  1.檢視錶空間的名稱及大小
  
  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;
  
  2.檢視錶空間物理檔案的名稱及大小
  
  select tablespace_name, file_id, file_name,
  round(bytes/(1024*1024),0) total_space
  from dba_data_files
  order by tablespace_name;
  
  3.檢視回滾段名稱及大小
  
  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
  
  15。耗資源的程式(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
  
  16。檢視鎖(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
  
  --檢視低效率的SQL語句
  
  SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
  ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
  ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
  SQL_TEXT
  FROM  V$SQLAREA
  WHERE EXECUTIONS>0
  AND   BUFFER_GETS > 0
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
  ORDER BY 4 DESC
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017055/,如需轉載,請註明出處,否則將追究法律責任。

相關文章