以perfstat用户连接,如果你刚执行完@spcreate,则oracle默认将当前用户切换为perfstat 。

  首先生成两次采样。

    SQL>execute statspack.snap

    PL/SQL procedure successfully completed.

    SQL>execute statspack.snap

    PL/SQL procedure successfully completed.

执行@spreport生成报告(该文件物理存放路径与spcreate相同)。

    SQL> @spreport

    Current Instance

    ~~~~~~~~~~~~~~~~

       DB Id    DB Name     Inst Num Instance

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

     3398983194 JSSWEB              1 jssweb

    Instances in this Statspack schema

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

       DB Id    Inst Num DB Name      Instance     Host

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

     3398983194        1 JSSWEB       jssweb       JSS

    Using 3398983194 for database Id

    Using          1 for instance number

    Specify the number of days of snapshots to choose from

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Entering the number of days (n) will result in the most recent

    (n) days of snapshots being listed.  Pressing  without

    specifying a number lists all completed snapshots.

    Listing all Completed Snapshots

                                                           Snap

    Instance     DB Name        Snap Id   Snap Started    Level Comment

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

    jssweb       JSSWEB               1 05 9 月  2007 12:5     5

                                        9

                                      2 05 9 月  2007 13:0     5

                                        2

  输入采样的起始值和结束值,注意在生成报告的时候所选择的采样不能跨越一次停机(即 stats$snapshot 中STARTUP_TIME相同 ) ,不然会报错。

    Specify the Begin and End Snapshot Ids

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    输入 begin_snap 的值:  1

    Begin Snapshot Id specified: 1

    输入 end_snap 的值:  2

    End   Snapshot Id specified: 2

    Specify the Report Name

    ~~~~~~~~~~~~~~~~~~~~~~~

    The default report file name is sp_1_2.  To use this name,

    press  to continue, otherwise enter an alternative.

    输入 report_name 的值:  d:\report.txt

  报告文件的输出路径。

    ................

    ................

    ................

    undo_tablespace               UNDOTBS1

    user_dump_dest                F:\ORACLE\PRODUCT\10.2.0\ADMIN\JS

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

    End of Report ( d:\report.txt )

  从生成采样到生成报告的大致操作步骤就是这样,当然我们这样操作在实际业务过程中是不现实的,主要的问题有以下几条:

  1、 采样生成间隔时间太短,未必能真正体现出服务器在业务实际运行中的状态,并且时间太短的情况下,可能statspack运行本身都会对分析结果的生成造成影响,毕竟statspack也是在运行一堆sql,也会被计入统计范围内。

  2、 采样的频度太低,以上述为例仅执行两次,以此为基准生成的报告恐怕也真的是仅供参考。

  解决上述问题,我们按照如下步骤实施:

  1 、创建一个job,我们设定其每个小时自动收集一次采样。

    Variable  job  number ;

    begin

      dbms_job.submit(:job, ¨statspack.snap;¨ ,trunc( sysdate + 1 / 24 , ¨hh24¨ ), ¨trunc(sysdate+1/24,¨¨hh24¨¨)¨ );

       commit ;

    end ;

    /

  查看当前job

    SQL> select job,schema_user,next_date,interval,what from user_jobs

           JOB SCHEMA_USE NEXT_DATE      INTERVAL                       WHAT

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

            44 PERFSTAT    11 -9 月 -07     trunc(SYSDATE+1/24,¨HH¨)       statspack.snap;

  2 、考虑到采样结果还是相当占空间,不能让其一直执行下去,我们再创建一个job,让它在明天凌晨自动停止采样job的执行。

    Variable  job  number ;

    begin

      dbms_job.submit(:job, ¨dbms_job.broken(44,true);¨ ,trunc( sysdate + 1 ), ¨null¨ );

       commit ;

    end ;

    /

  Ok, 竣工,等上几个小时,看看采样生成的怎么样了。

    SQL> select snap_id,snap_time,startup_time from stats$snapshot;

       SNAP_ID SNAP_TIME           STARTUP_TIME

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

            11 2007-09-11 11:00:03 2007-09-11 09:16:05

            12 2007-09-11 12:00:03 2007-09-11 09:16:05

            13 2007-09-11 13:00:04 2007-09-11 09:16:05

             1 2007-09-10 12:59:56 2007-09-10 09:04:22

             2 2007-09-10 13:02:01 2007-09-10 09:04:22

  重新执行@spreport,再生成一份报告看看吧。

  如果你想删除某些statspack收集的历史采样,直接通过delete,指定snap_id即可:

    SQL> delete stats$snapshot where snap_id=1;

    已删除 1 行。

    SQL> select snap_id,snap_time,startup_time from stats$snapshot;

       SNAP_ID SNAP_TIME           STARTUP_TIME

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

            11 2007-09-11 11:00:03 2007-09-11 09:16:05

            12 2007-09-11 12:00:03 2007-09-11 09:16:05

            13 2007-09-11 13:00:04 2007-09-11 09:16:05

             2 2007-09-10 13:02:01 2007-09-10 09:04:22

    SQL>

  如果你想删除所有的采样数据但保留statspack的库结构,oracle也提供了脚本,执行@sptrunc即可。该脚本是通过truncate删除各表记录,效率比delete高很多。

  如果你想彻底干掉本机安装的statspack的话,那就更简单了,执行@spdrop,干净不留痕:)。

  注:如果你在执行@spxxx的时候报SP-0310错误,可能是SQLPATH路径未设,你可以通过三种方式解决:

  1、 本地设置SQLPATH:

  F:\> SET SQLPATH=F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN

  如果用这种方式的话,本次会话结束SQLPATH就失效了,下次打开还得再次设置。

  2、 设置注册表(linux环境的话就设置环境变量):

  开始->运行->regedit

  HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->KEY_ORADB10G-> 新建字符串值SQLPATH,数值数据:F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN

  3、 指定全路径:

  SQL> @F:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spreport.sql

  或

  SQL> @%ORACLE_HOME%\RDBMS\ADMIN\spreport.sql