天天看點

Oracle第二話之調優工具

Oracle第二話之調優工具

原創if 0 = -I can 釋出于2019-04-09 19:53:12 閱讀數 172  收藏

展開

目錄

1、告警日志

2、使用者程序trace檔案

3、動态性能視圖

4、statspack 安裝産生報告

5、生成AWR ADDM ASH 報告

6、explan  --用來看執行計劃

       資料庫出現任何問題,第一件事就是先看告警日志檔案。

1)告警日志内容:

(1)啟動時間以及操作模式的啟動和關閉指令。

(2)涉及實體結構的操作,使用ALTER DATABASE指令。

(3)表空間操作。

(4)所有日志切換與歸檔,包括所影響檔案的名稱。

(5)用于啟動執行個體的非預設初始化參數,含ALTER SYSTEM修改的參數。

(6)告警日志包含了影響資料庫結構和執行個體的各種操作的連續曆史記錄。

(7)告警日志不包含SQL語句(DML,DDL)

2)告警日志包含常見的告警與錯誤:

(1)檢查點不完全:說明日志檔案過小而引起日志切換頻繁。

(2)無法打開檔案:在資料庫啟動過程中産生。

(3)塊訛誤:某個資料檔案損壞引起。與DBA_EXTENTS視圖一起檢視。

(4)歸檔存在問題:歸檔目的地滿或不可用。

(5)死鎖。

3)檢視告警日志

(1)SQL> show parameter dump            --檢視告警日志存放位址

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

background_core_dump                 string      partial

background_dump_dest                 string      /u01/app/oracle/oradata/PROD/b

                                                 dump

core_dump_dest                       string      /u01/app/oracle/oradata/PROD/c

max_dump_file_size                   string      UNLIMITED

shadow_core_dump                     string      partial

user_dump_dest                       string      /u01/app/oracle/oradata/PROD/u

(2)[oracle@gc1 ~]$ cd /u01/app/oracle/oradata/PROD/bdump

(3)[oracle@gc1 bdump]$ ls

alert_PROD.log      prod_arc1_2547.trc  prod_arc2_2576.trc  prod_lgwr_2533.trc  prod_rvwr_2542.trc

(4)[oracle@gc1 bdump]$ tail -f alert_PROD.log       --檢視告警日志

4)定期管理:時間一長,告警日志就會增多,告警日志可以删除,但作業系統日志不可删(系統會起不來的)。

删除告警日志:

$ cat /dev/null > /u01/app/oracle/oradata/PROD/bdump/alert_PROD.log

使用者程序trace檔案一般由server程序産生。

1)SQL> show parameter trace;               --檢視

log_archive_trace                    integer     0

sql_trace                            boolean     FALSE                                --可以跟蹤session中的操作,可以顯示解析了幾次,傳回了幾行資料等

trace_enabled                        boolean     TRUE

tracefile_identifier                 string

用于統計使用者執行的sql語句,可以通過這些統計資訊,判斷sql語句的執行過程和對資源調。預設,oracle對使用者執行的sql語句不做跟蹤。

2)實驗一        --跟蹤目前session

(1)SQL> grant alter session to scott;          --授予更改會話權限個scott使用者

(2)SQL> conn scott/tiger                              --用scott使用者登入

(3)SQL> alter session set sql_trace=true;               --在scott使用者會話中打開跟蹤,該為true就可以跟蹤了

(4)SQL> select empno,ename,job from emp where empno=7788;

     EMPNO ENAME      JOB

---------- ---------- ---------

      7788 SCOTT      ANALYST

(4)SQL> select empno,ename,job from emp where empno=7900;

      7900 JAMES      CLERK

(4)SQL> alter session set sql_trace=false;        --關閉跟蹤

(5)sys使用者查詢追蹤資訊

SQL> col machine for a10

SQL> col username for a10

SQL> select p.spid,s.machine,s.username,s.sid,s.serial#,s.status from v$session s,v$process p where s.sid in (select sid from v$session where username is not null) and s.paddr=p.addr;

SPID         MACHINE    USERNAME          SID    SERIAL# STATUS

------------ ---------- ---------- ---------- ---------- --------

2585         gc1        SYS               289          3 ACTIVE

2618         gc1        SCOTT             275          8 INACTIVE

另一種查詢方法:

SQL> select username,sid,serial# from v$session where username is not null;

USERNAME          SID    SERIAL#

---------- ---------- ----------

SCOTT             275          8

SYS               289          3

(6)檢視檔案内容

$ cd /u01/app/oracle/oradata/PROD/udump        --到udump下

$ ls -lht

-rw-r----- 1 oracle oinstall  82K May  3 12:50 prod_ora_2618.trc

$ more prod_ora_2618.trc                 --看不懂,需要借助工具

$ tkprof                    --檢視tkprof使用方法,将檔案變為可讀形式

$ tkprof prod_ora_2618.trc /home/oracle/scott.txt sys=no sort=fchela      --将源檔案變換後儲存在/home/oracle/scott.txt 中,sys=no表示把sys使用者的操作排除在外,sort=fchela 表示排序。

$ more /home/oracle/scott.txt          --檢視資訊

select empno,ename,job

from

 emp where empno=7788

call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.01       0.01          0          0          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        2      0.00       0.00          2          2          0           1

total        4      0.01       0.01          2          2          0           1                           --傳回行數4行

Misses in library cache during parse: 1                             --硬解析一次

Optimizer mode: ALL_ROWS

Parsing user id: 25  

3)實驗二              --跟蹤其他session

(1)SQL> select username,sid,serial# from v$session where username is not null;

(2)SQL> exec dbms_system.set_sql_trace_in_session(275,8,sql_trace=>true);                   --在sys使用者下開起跟蹤scott使用者的會話

(3)在scott使用者下,使用綁定變量查詢

SQL> variable enum number;

SQL> exec :enum:=7788;             --引用變量進行指派

SQL> select empno,deptno,job,sal,deptno from emp where empno=:enum;

     EMPNO     DEPTNO JOB              SAL     DEPTNO

---------- ---------- --------- ---------- ----------

      7788         20 ANALYST         3000         20

SQL> exec :enum:=7900;               --在指派

      7900         30 CLERK            950         30

(4)SQL> exec dbms_system.set_sql_trace_in_session(275,8,sql_trace=>false);              --關閉追蹤

select empno,deptno,job,sal,deptno

 emp where empno=:enum

BEGIN :enum:=7788; END;

Parse        1      0.00       0.00          0          0          0           0

Execute      1      0.00       0.00          0          0          0           1

Fetch        0      0.00       0.00          0          0          0           0

total        2      0.00       0.00          0          0          0           1                        --傳回兩行資料

Misses in library cache during parse: 1                                        --解析1次

Misses in library cache during execute: 1

4)搜集統計資訊

(1)對表進行分析擷取最新資料

SQL> analyze table scott.emp compute statistics;                     --對小表用compute

SQL> analyze table scott.emp estimate statistics;                     --對大表用estimate

(2)

a)

Oracle第二話之調優工具

b)

Oracle第二話之調優工具

c)

Oracle第二話之調優工具

d)粘貼如下資訊

DBMS_STATS.GATHER_TABLE_STATS (

(3)SQL> exec  DBMS_STATS.GATHER_TABLE_STATS ('SCOTT','EMP');             --用包收集SCOTT使用者的EMP表的統計資訊

(4)收集索引統計資訊

SQL> analyze index scott.pk_emp validate structure;             --收集索引統計資訊

SQL> exec DBMS_STATS.GATHER_INDEX_STATS('SCOTT','PK_EMP');        --用包收集SCOTT使用者EMP表上的索引的統計資訊

(5)收集使用者統計資訊

SQL> exec DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT');

(6)收集資料庫統計資訊

SQL> exec DBMS_STATS.GATHER_DATADASE_STATS(                       --格式不清除,看官方文檔

1)靜态視圖:                --體系第一章表空間段區塊的查詢

在資料庫open狀态下通路,用于了解資料庫的實體結構資訊。

大部分以dba,all,user打頭,并多用複數形式。例如表和索引的統計資訊。

User_:存儲目前使用者所擁有的對象的相關資訊

All_:存儲目前使用者能夠通路的對象(包括使用者所擁有的對象和别的使用者授權通路的對象)的資訊。

Dba_:存儲所有使用者對象的資訊(預設隻能有sys/system使用者通路)

2)動态視圖:

大部分在mount下就可以通路,反映資料庫實時的狀态。

大部分以v$開頭,多用單數,從控制檔案和記憶體中讀出。

從v$fixed_table這個視圖查到所有的動态視圖的名稱

用于調優和資料庫監控

SQL> select name from v$tablespace;              --查詢表空間

NAME

------------------------------

SYSTEM

UNDOTBS

SYSAUX

TEMPTS

USERS

SQL> select file#,name from v$datafile;                --查詢資料檔案

     FILE# NAME

---------- --------------------------------------------------

         1 /u01/app/oracle/oradata/PROD/disk3/system01.dbf

         2 /u01/app/oracle/oradata/PROD/disk4/undotbs01.dbf

         3 /u01/app/oracle/oradata/PROD/disk4/sysaux01.dbf

         4 /u01/app/oracle/oradata/PROD/disk3/users01.dbf

SQL> select file#,name from v$tempfile;               --查詢臨時檔案

         1 /u01/app/oracle/oradata/PROD/disk5/temp01.dbf

3)系統統計資訊

統計資訊大部分都記錄在v$sysstat中。

(1)SQL> desc v$sysstat;

 Name                                                  Null?    Type

 ----------------------------------------------------- -------- ------------------------------------

 STATISTIC#                                                     NUMBER

 NAME                                                           VARCHAR2(64)

 CLASS                                                          NUMBER

 VALUE                                                          NUMBER

 STAT_ID                                                        NUMBER

(2)SQL> select count(*) from v$sysstat;

  COUNT(*)

----------

       363

(4)SQL> select name,value from v$sysstat;

(5)檢視SGA裡的統計資訊

SQL> select * from v$sgastat where name like 'log%';

POOL         NAME                                                    BYTES

------------ -------------------------------------------------- ----------

             log_buffer                                            2973696

shared pool  log_simultaneous_copies                                   248

shared pool  log file size history arr                                 168

shared pool  log_checkpoint_timeout                                  12360

(6)檢視各個池的大小

SQL> select name,bytes/1024/1024 m from v$sgainfo;

NAME                                                        M

-------------------------------------------------- ----------

Fixed SGA Size                                     1.16325378

Redo Buffers                                        2.8359375

Buffer Cache Size                                         276

Shared Pool Size                                          112

Large Pool Size                                             4

Java Pool Size                                              4

Streams Pool Size                                           0

Granule Size                                                4

Maximum SGA Size                                          400

Startup overhead in Shared Pool                            40

Free SGA Memory Available                                   0

4)等待事件統計資訊

(1)查詢等待事件

SQL> desc v$event_name;

SQL> select name from v$event_name where name like 'log%';

SQL> select name from v$event_name where name like 'buffer busy wait%';

--------------------------------------------------

buffer busy waits

(2)查詢等待事件的值

SQL> desc v$system_event;

SQL> col event for a30

SQL> select EVENT,TOTAL_WAITS,TOTAL_TIMEOUTS,TIME_WAITED,AVERAGE_WAIT from v$system_event where event like 'log%';

EVENT                          TOTAL_WAITS TOTAL_TIMEOUTS TIME_WAITED AVERAGE_WAIT

------------------------------ ----------- -------------- ----------- ------------

log file sequential read                 8              0           0          .05

log file single write                    8              0           0          .04

log file parallel write               2570              0         453          .18

log file sync                           19              2         256        13.48

5)會話統計資訊               

(1)SQL> desc v$session              --查詢目前登入使用者資訊。

(2)SQL> select username,sid,serial# from v$session where username is not null;

(3)查詢更詳細的資訊

col username for a10

col name for a30

select se.sid,se.serial#,se.username,st.class,st.name,ses.value;

from v$session se,v$statname st,v$sesstat ses

where se.sid=ses.sid

and ses.statistic#=st.statistic#

and se.username is not null

and ses.value<>0

and se.username<>'SYS';

select se.sid,se.serial#,se.username,st.class,st.name,ses.value

and se.username='&username';                                           --可以動态檢視某個使用者的會話統計資訊

(4)class

1 代表執行個體活動

2 代表redo buffer活動

4 代表鎖

8 代表資料緩沖活動

16 代表并行活動

64 代表表通路

128 代表調試資訊

在本session中查詢,pga超過300k的使用者資訊。

select username,name,trunc(value/1024) k

from v$statname n,v$session s,v$sesstat t

where s.sid=t.sid

and n.statistic#=t.statistic#

and s.type='USER'

and s.username is not null

and n.name='session pga memory'

and t.value>300000;

USERNAME   NAME                          K

---------- -------------------- ----------

SYS        session pga memory         1403

報告就是各個快照統計值比較的結果

statspack的由來——statistics package

Inspect 檢查

Expect 期望

Respect 尊重

Prospect 展望

運作statspack 期間必須session 上設定TIMED_STATISTICS=TRUE,否則統計的資料将失真。

Job_queue_processes=15,該參數不大于1就生成不了報告。

兩個重要參數:

(1)SQL> show parameter job;

job_queue_processes                  integer     15                        --該參數不大于1就生成不了報告    

(2)SQL> show parameter timed;

timed_os_statistics                  integer     0

timed_statistics                     boolean     TRUE                           --設定TIMED_STATISTICS=TRUE,否則統計的資料将失真

1)建立表空間

(1)SQL> select tablespace_name,contents,status from dba_tablespaces;

TABLESPACE_NAME                CONTENTS  STATUS

------------------------------ --------- ---------

SYSTEM                         PERMANENT ONLINE

UNDOTBS                        UNDO      ONLINE

SYSAUX                         PERMANENT ONLINE

TEMPTS                         TEMPORARY ONLINE

USERS                          PERMANENT ONLINE

(2)SQL> select file#,name from v$datafile;

(3)SQL> create tablespace tools datafile '/u01/app/oracle/oradata/PROD/disk3/tool01.dbf' size 10m;            --statspack至少需要200M,OCM考試會故意讓你設小,需要将它改大。

(4)SQL> select file#,name from v$datafile;

         5 /u01/app/oracle/oradata/PROD/disk3/tool01.dbf

(5)SQL> alter database datafile 5 resize 200m;               --将表空間改為200M

SQL> alter database datafile 5 autoextend on next 10m maxsize unlimited;                 --設為自動增長,無最大限制

(6)檢視文集大小

SQL> select file_id,file_name,tablespace_name,bytes/1024/1024 m from dba_data_files;

   FILE_ID FILE_NAME                                          TABLESPACE          M

---------- -------------------------------------------------- ---------- ----------

         1 /u01/app/oracle/oradata/PROD/disk3/system01.dbf    SYSTEM            325

         2 /u01/app/oracle/oradata/PROD/disk4/undotbs01.dbf   UNDOTBS           200

         3 /u01/app/oracle/oradata/PROD/disk4/sysaux01.dbf    SYSAUX            325

         4 /u01/app/oracle/oradata/PROD/disk3/users01.dbf     USERS              50

         5 /u01/app/oracle/oradata/PROD/disk3/tool01.dbf      TOOLS             200

2)跑腳本                 --注意是用sys使用者跑

(1)SQL> @?/rdbms/admin/spcreate

Enter value for  perfstat_password: perfstat

Enter value for default_tablespace:TOOLS

Enter value for temporary_tablespace: TEMPTS

(2)檢視資訊

$ cd $ORACLE_HOME/rdbms/admin

$ ls |grep spcpkg

spcpkg.sql

$ more spcpkg.sql

3)調整快照級别為7

SQL> conn perfstat/perfstat

SQL> desc statspack;

SQL> exec statspack.MODIFY_STATSPACK_PARAMETER(I_SNAP_LEVEL=>7);

4)建立一個job,每隔五分鐘執行

[oracle@gc1 admin]$ pwd

/u01/app/oracle/product/10.2.0/db_1/rdbms/admin

[oracle@gc1 admin]$ ls |grep spauto

spauto.sql

$ vi spauto.sql                                --修改參數,原本1小時生成1個快照,該為5分鐘

spool spauto.lis

--  Schedule a snapshot to be run on this instance every hour, on the hour

variable jobno number;

variable instno number;

begin

  select instance_number into :instno from v$instance;

  dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/288,'MI'), 'trunc(SYSDATE+1/288,''MI'')', TRUE, :instno);

  commit;

end;

/

SQL> select 12*24 from dual;                     --1小時有12個5分鐘,1天分為24個小時

     12*24

       288

5)執行@?/rdbms/admin/spauto                --在perfstat使用者中,之前已經連接配接

(1)SQL> @?/rdbms/admin/spauto                --跑腳本

如下是腳本中的内容,不用執行:

(SQL> select job, next_date, next_sec

  2    from user_jobs

  3   where job = :jobno;

       JOB NEXT_DATE NEXT_SEC

---------- --------- ----------------

         1 04-MAY-14 09:51:00

(2)SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;    --檢視時間

TO_CHAR(SYSDATE,'YY

-------------------

2014-05-04 09:49:51

(3)SQL> select snap_id,snap_level from stats$snapshot;             --檢視快照資訊

   SNAP_ID SNAP_LEVEL

---------- ----------

         1          7

(4)手動生成快照

SQL> exec statspack.snap();

SQL> select snap_id,snap_level from stats$snapshot;

         3          7

6)跑腳本            --用SYS使用者跑

(1)SQL> show user

USER is "SYS"

(2)SQL> create table test(id number(8),name varchar2(30));

(3)插入100萬行資料                                   --爛代碼

declare

 sql_text varchar2(100);

 for i in 1..1000000 loop

  sql_text:='insert into test values('||i||','''||'zhangsan'||i||''')';

  execute immediate sql_text;

  if mod(i,1000)=0 then

     commit;

  end if;

 end loop;

 commit;

7)檢視statspack報告                  --如下5、中的3),發現這段代碼問題很多

8)清除快照

AWR是oracle的自動快照工具,一般每小時産生一個快照。

AWR(Automatic workload repository)工作負載自動存儲報告。

       AWR是ORACLE 10g後推出的一個新技術構架,其實就是9i的statspack的演變和增強版本。通過AWR,ORACLE可自動采集,儲存和管理系統負載和性能統計資料,用于問題診斷分析和系統自動調整等。AWR面向的服務對象包括内部的ADDM和其他自動優化和診斷工具,以及外部的EM、SQL*PLUS等工具。AWR原理意圖如下所示。

         即AWR資料主要由兩部分組成。

(1)儲存在記憶體中的系統負載和性能統計資料,主要通過v$視圖進行通路。

(2)ORACLE通過10g新的MMPN程序定期自動以快照(snapshot)形式将儲存在記憶體中的AWR資料,轉存到磁盤中,用于性能資料的長期儲存和分析,這些資料主要通過DBA_*視圖進行通路。

Oracle第二話之調優工具

ADDM(automatic database dignostics monitor)資料庫自動診斷監控報告

ASH(active  session history)曆史報告

可以通過v$ACTIVE_SESSION_HISTORY視圖檢視記憶體中ASH的資訊

AWR是oracle 10g中的一個新特性,類似于10g以前的statspack。不過在使用上要比statspack簡單,提供的新能名額要比statspack多很多,能更好的幫助DBA來發現資料庫的性能瓶頸。

AWR是oracle安裝好後自動啟動的,不需要特别的設定。收集的統計資訊存儲在SYSAUX表空間SYS模式下,以WRM$_*和WRH$_*的格式命名,預設會保留最近7天收集的統計資訊。每個小時将收集到的資訊寫到資料庫中,這一系列操作是由一個叫MMON的程序來完成的。

AWR存儲的資料分類:

WRM$表存儲AWR的中繼資料(awrinfo.sql腳本)

WRH$表存儲采樣快照的曆史資料(awrrpt.sql腳本)

WRI$表存儲同資料庫建議功能相關的資料(ADDM相關資料)

       awr報表實際上是statpck報表的延伸,當然10gR2中還是報留了statpack,并且statpack也增加了對stream_pool的監控,awr與statpack的差別就是awr的快照的收集與維護更加自動化,預設的保留七天的快照,并且可以通過dbms_workload_repository表修改快照的收集頻率與快照的保留時間,dba要幹預的已經很少了,比statpack維護更簡單(sp是手動的,awr是自動的)。

       awr與ash的最主要的差別在于:awr是平面的,全面的,ash是立體的,更側重于session的event跟蹤,由于業務量大的資料庫的event wait是瞬息萬變,awr很可能會監控不到,為了彌補這個不足,ash才可以對session的event進行跟蹤。

        ash與addm的差別在于:addm更側重于基于對當資料庫目前狀态的分析,對存在的問題提供指導性的意見,可以說ash,addm是awr的補充,awr全面的收集資料庫的狀态,但ash/addm是側重要對收集的資料進行分析,并提供一些有益的建議。

1)準備工作                       --設定導出報告存放位置

如圖所示:設定預設上傳和下載下傳位址,下面進行的sz操作會預設導出檔案到如下目錄中。

Oracle第二話之調優工具

1)手工生成報告步驟

指令:手工抓取快照方式,快照級别TYPICAL      ALL(采集名額更完整)

SQL> exec dbms_workload_repository.create_snapshot('TYPICAL');       --手工生成快照

SQL> exec dbms_workload_repository.modify_snapshot_settings(retention => 14400,interval =>30,topnsql => 30);               --保留10天10*24*60=14400分鐘,30分鐘一個快照,一個快照中最多儲存30個SQL

2)生成AWR ADDM ASH報告:

(1)生成statspack報告

a)SQL> @?/rdbms/admin/spreport

Instance     DB Name        Snap Id   Snap Started    Level Comment

------------ ------------ --------- ----------------- ----- --------------------

PROD         PROD                 1 04 May 2014 09:51     7

                                  3 04 May 2014 09:54     7

                                 11 04 May 2014 10:51     7

Enter value for begin_snap: 3                        --從3開始     

Enter value for end_snap: 11                           --到11結束

Enter value for report_name: /home/oracle/statspack.1st                          --儲存位址

b)[oracle@gc1 ~]$ ls

Desktop  h       PROD      spauto.lis  spctab.lis  statspack.1st

control01.bak  flash    logmnr  prod_bak  spcpkg.lis  spcusr.lis  utl

c)将檔案從虛拟機中取到windows下載下傳中

$ sz statspack.1st                       --導出檔案

d)打開“我的電腦”收藏夾裡的“下載下傳”中檢視

(2)生成AWR報告

a)SQL> show user         

USER is "PERFSTAT"

b)SQL> select job from dba_jobs;

       JOB

         1

c)SQL> exec dbms_job.remove(1);                      --如果這句話失敗,執行SQL> exec dbms_ijob.remove(1);

d)SQL> conn /as sysdba

e)SQL> @?/rdbms/admin/awrrpt

Enter value for report_type:                                   --回車就可以,預設html格式

Enter value for num_days: 2                                --檢視2天内的報告

Instance     DB Name        Snap Id    Snap Started    Level

------------ ------------ --------- ------------------ -----

PROD         PROD                29 04 May 2014 09:47      1

                                 30 04 May 2014 11:00      1

                                 31 04 May 2014 11:29      1

                                 32 04 May 2014 11:34      1

                                 33 04 May 2014 11:35      1

Enter value for begin_snap: 32

Enter value for end_snap: 33

Enter value for report_name: /home/oracle/myawr.html                     --存放位址

f)$ ls                --檢視

control01.bak  flash  logmnr      PROD      spauto.lis  spctab.lis  statspack.1st

Desktop        h      myawr.html  prod_bak  spcpkg.lis  spcusr.lis  utl

g)$ sz myawr.html

(3)生成ADDM報告              --預設類型TXT

a)SQL> @?/rdbms/admin/addmrpt

Enter value for begin_snap: 32                         --開始

Enter value for end_snap: 33                                    --結束

Enter value for report_name: /home/oracle/myaddm.txt                --存放位址

b)$ ls                                    --檢視

control01.bak  flash  logmnr      myawr.html  prod_bak    spcpkg.lis  spcusr.lis     utl

Desktop        h      myaddm.txt  PROD        spauto.lis  spctab.lis  statspack.1st

e)$ sz myaddm.txt

(4)生成ASH報告

a)SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;           --檢視目前時間

2014-05-04 11:51:47

b)SQL> @?/rdbms/admin/ashrpt

Enter value for report_type:                        --直接回車,預設類型html

Enter value for begin_time: -30                     --看30分鐘前的資訊

Enter value for duration: 30                       --到現在的

Enter value for report_name: /home/oracle/myash.html           --存儲位址

c)$ ls

control01.bak  flash  logmnr      myash.html  PROD      spauto.lis  spctab.lis  statspack.1st

Desktop        h      myaddm.txt  myawr.html  prod_bak  spcpkg.lis  spcusr.lis  utl

d)$ sz myash.html

3)檢視statspack報告                        --文檔補充中詳細解讀statspack報告,發現之前的代碼問題很大。

檢視統計報表,首先檢視十項内容:

1)首要的5個等待事件(TOP 5 WAIT EVENTS) 

2)負載簡檔(LOAD PROFILE)

3)執行個體效率點選率(INSTANCE EFFICIENCY HIT RATIOS)

4)等待事件(WAIT EVENTS)

5)闩鎖等待(LATCH WAITS) latch activity

6)首要的SQL(TOP SQL)  sql ordered by cpu

7)執行個體活動(INSTANCE ACTIVITY) instance activity

8)檔案I/O(FILE I/O) ordered by ios

9)記憶體配置設定(MEMORY ALLOCATION) sga memory summary library cache activity 

10)緩沖區等待(BUFFER WAITS) buffer pool advisory 

cd /home/oracle

more statspack.1st

11)PGA統計資訊(PGA STATS)pga aggr target stats   pga memory advisory

4)檢視AWR報告           --直接用浏覽打開檢視

6、explan                     --用來看執行計劃

explan多用于開發階段,隻生成執行計劃。

SQL> @?/rdbms/admin/utlxplan

也可以SQL> @?/rdbms/admin/utlxpls.sql

utlxplan腳本如果裝過autotrace的都跑過了。

1)執行一句話

SQL> explain plan set statement_id='p_emp_dept' for select e.empno,ename,e.sal,d.deptno from scott.emp e,scott.dept d where e.deptno=d.deptno;                      --id值是自己設定的名字

2)檢視執行計劃

SQL> col operation for a18

SQL> col options for a15

SQL> col object_name for a10

SQL> col object_type for a15

SQL> select a.operation,options,object_name,cost,object_type,id,parent_id from plan_table a where statement_id='p_emp_dept' order by id;                 

OPERATION          OPTIONS         OBJECT_NAM       COST OBJECT_TYPE             ID  PARENT_ID

------------------ --------------- ---------- ---------- --------------- ---------- ----------

SELECT STATEMENT                                       2                          0

NESTED LOOPS                                           2                          1          0

TABLE ACCESS       FULL            EMP                 2 TABLE                    2          1

INDEX              UNIQUE SCAN     PK_DEPT             0 INDEX (UNIQUE)           3          1

另一種檢視方法:            --檢視執行計劃

SQL> select * from table(dbms_xplan.display);

------------------------------------------------------------------------------

| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

|   0 | SELECT STATEMENT   |         |    14 |   280 |     2   (0)| 00:00:01 |

|   1 |  NESTED LOOPS      |         |    14 |   280 |     2   (0)| 00:00:01 |

|   2 |   TABLE ACCESS FULL| EMP     |    14 |   238 |     2   (0)| 00:00:01 |

|*  3 |   INDEX UNIQUE SCAN| PK_DEPT |     1 |     3 |     0   (0)| 00:00:01 |

--但是沒有統計資訊,看不到讀磁盤的次數。因為隻産生執行計劃,沒有真正執行語句。

3)另一種常用的寫法               --檢視執行計劃

SQL> set pagesize 0 linesize 200              --不分頁,不換行

SQL> set timing on                                           --檢視執行所消耗的時間

SQL> alter session set statistics_level=all;               --把統計級别調高

SQL> select e.empno,e.ename,e.sal,d.deptno,d.dname from scott.emp e,scott.dept d where e.deptno=d.deptno;                           --查資料

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));    --檢視執行計劃,沒成功

4)utlbstat.sql和utlestat.sql                 --很少使用,也是用于檢視執行計劃

我們可以定義一個開始時間和結束時間,來分析一天當中的繁忙時段,這兩個腳本用的較少,收集的統計資訊不完整。b代表begin,e代表end。用的較多的是statspack和awr(自動快照工具)。

報告用來比較的,是以要加上一個時間段的前提才有意義。

要對比繁忙階段和一般時段(baseline)。單個快照是看不出問題的。

5)v$sql或v$sql_plan                 --檢視執行計劃

用于根據sql_id檢視相應的執行計劃:

(1)SQL> select e.empno,e.ename,e.sal,d.deptno,d.dname from scott.emp e,scott.dept d where e.deptno=d.deptno;

(2)SQL> select sql_id,sql_text from v$sql where sql_text like 'select e.empno,e.ename,e.sal,d.deptno,d.dname from scott.emp e,scott.dept d where e.deptno=d.deptno%';

SQL_ID                 SQL_TEXT

------------- ---------------------------------------------------

2hjnq24dd2khj select e.empno,e.ename,e.sal,d.deptno,d.dname from

               scott.emp e,scott.dept d where e.deptno=d.deptno

(3)SQL> select plan_table_output from table(dbms_xplan.display_cursor('2hjnq24dd2khj'));

----------------------------------------------------------------------------------------

| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

|   0 | SELECT STATEMENT             |         |       |       |     3 (100)|          |

|   1 |  NESTED LOOPS                |         |    14 |   420 |     3   (0)| 00:00:01 |

|   2 |   TABLE ACCESS FULL          | EMP     |    14 |   238 |     2   (0)| 00:00:01 |

|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    13 |     1   (0)| 00:00:01 |

|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)|          |