Home skin

 

   Location : TOP > Usage
         > Verification.1
 
     
   - Step1 STATSPACKのインストール
 - Step2 スナップショットの取得(1回目)
 - Step3 負荷がけの実行・性能の測定
 - Step4 負荷がけの停止
 - Step5 STATSPACKの取得(2回目)
 - Step6 インデックスの削除
 - Step7 スナップショットの取得(3回目)
 - Step8 負荷がけの実行・性能の測定・停止
 - Step9 スナップショットの取得(4回目)
 - Step10 TGによる性能情報の比較・分析
 - Step11 STATSPACKレポートの取得
 - Step12 STATSPACKレポートの比較・分析
 - Step13 実行計画の取得
 - Step14 実行計画の比較・分析
 
     
   >> TOP  
 
   

 

 

 

 

ここではデータベースに「ORACLE」を使用し、インデックスの有無による検索(SELECT)性能の変化を確認します。

負荷がけにはTGのサンプルトランザクション「smpl_oltp_oracle_vX.X.tgp」を使用し、データベースの統計情報取得にはORACLE標準のツールである「STATSPACK」を使用します。またORACLEはLinux OS上で稼動しているものとします。

サンプルトランザクションの使用方法については併せてこちらを参照してください。

 

  Step1 - STATSPACKのインストール -
まずはじめにSTATSPACKのインストールを行います。SQL$Plusを使用してSYSDBAユーザにてデータベースに接続し、スクリプト「$ORACLE_HOME/rdbms/admin/spcreate.sql」を実行してください。
 
※ STATSPACKのインストール実行結果
-bash-3.00$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.2.0 - Production on Tue Dec 9 23:04:02 2008

Copyright (c) 1982, 2005, Oracle. All Rights Reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning and Data Mining options

SQL> @?/rdbms/admin/spcreate

Choose the PERFSTAT user's password
-----------------------------------
Not specifying a password will result in the installation FAILING

Enter value for perfstat_password: perfstat ←ユーザ名を指定。
perfstat

Choose the Default tablespace for the PERFSTAT user
---------------------------------------------------
Below is the list of online tablespaces in this database which can
store user data. Specifying the SYSTEM tablespace for the user's
default tablespace will result in the installation FAILING, as
using SYSTEM for performance data is not supported.

Choose the PERFSTAT users's default tablespace. This is the tablespace
in which the STATSPACK tables and indexes will be created.

TABLESPACE_NAMECONTENTSSTATSPACK DEFAULT TABLESPACE
------------------------------ --------- ----------------------------
SYSAUXPERMANENT*
USERSPERMANENT

Pressing <return> will result in STATSPACK's recommended default
tablespace (identified by *) being used.

Enter value for default_tablespace: ←リターンキーを押します。

Using tablespace SYSAUX as PERFSTAT default tablespace.


Choose the Temporary tablespace for the PERFSTAT user
-----------------------------------------------------
Below is the list of online tablespaces in this database which can
store temporary data (e.g. for sort workareas). Specifying the SYSTEM
tablespace for the user's temporary tablespace will result in the
installation FAILING, as using SYSTEM for workareas is not supported.

Choose the PERFSTAT user's Temporary tablespace.

TABLESPACE_NAMECONTENTSDB DEFAULT TEMP TABLESPACE
------------------------------ --------- --------------------------
TEMPTEMPORARY*

Pressing <return> will result in the database's default Temporary
tablespace (identified by *) being used.

Enter value for temporary_tablespace: ←リターンキーを押します。

Using tablespace TEMP as PERFSTAT temporary tablespace.


... Creating PERFSTAT user


... Installing required packages

             ・・・・ 中略 ・・・・

No errors.
Creating Package Body STATSPACK...

Package body created.

No errors.

NOTE:
SPCPKG complete. Please check spcpkg.lis for any errors.

SQL>
 

 

  Step2 - スナップショットの取得(1回目) -
続いてスナップショットの取得を行います。STATSPACKリポジトリの所有ユーザ「perfstat」にてプロシージャ「statspack.snap()」を実行してください。
 
※ スナップショットの取得実行結果
SQL> connect perfstat/perfstat
SQL> execute statspack.snap(i_snap_level => 7);

PL/SQL procedure successfully completed.

SQL>
 

 

  Step3 - 負荷がけの実行・性能の測定 -
TGより負荷がけを行います。Agentをデータベースに接続させ、トランザクションを開始させてください。TGCメインウィンドウより「Agent」メニューをクリックし、「Activate agents」を選択します。
 
 
 
その後性能情報の取得を行います。TGCのメインウィンドウより「Monitor」メニューをクリックし、「Monitoring start > Show summary」を選択してください。
 
 
 
ここでは10分間性能情報の取得を行い、以下の結果を得たものとします。
 
23:18:54 TRGT:ACTV CONN:10/10 DISC:0/10 TERM:0/10 ERR:0 TPS:10
23:18:55 TRGT:ACTV CONN:10/10 DISC:0/10 TERM:0/10 ERR:0 TPS:10
---- TRANSACTION REPORT ( SUMMARY ) ------------------

MONITORING PERIOD
~~~~~~~~~~~~~~~~~
- Begin: Tue Dec 09 23:08:56 JST 2008
- End: Tue Dec 09 23:18:55 JST 2008

THROUGHPUT
~~~~~~~~~~
Transaction nameMinMaxAverage
================ ==== ===== =======
VIEW_ITEMS0ms109ms 4.48ms
ORDER0ms266ms 8.62ms

TPS
~~~
- Total transaction count : 5975
- Monitoring time: 600 seconds
- Average TPS: 9.96

TG>
 

 

  Step4 - 負荷がけの停止 -
負荷がけを停止します。「Agent」メニューより「Freeze agents」を選択してください。
 
 

 

  Step5 - スナップショットの取得(2回目) -
続いてスナップショットの取得を行います。STATSPACKリポジトリの所有ユーザ「perfstat」にてプロシージャ「statspack.snap()」を実行してください。
 
※ スナップショットの取得実行結果
SQL> connect perfstat/perfstat
SQL> execute statspack.snap(i_snap_level => 7);

PL/SQL procedure successfully completed.

SQL>
 
これによりふたつのSTATSPACKスナップショットが取得できたことになります。負荷がけ開始前と後のスナップショットを使用して"インデックス有"の状態での性能情報を取得することが可能になりました。

 

  Step6 - インデックスの削除 -
続いて"インデックス無"の性能情報を取得するため、負荷がけ対象となるテーブル「ITEMLIST」に作成されているインデックスの削除を行います。

該当オブジェクトの所有ユーザにてデータベースに接続し、インデックスを削除してください。
 
※ インデックスの削除実行結果
SQL> connect test/test
Connected.
SQL> drop index IDX_ITEMLIST_CATEGORY;

Index dropped.

SQL>
 

 

  Step7 - スナップショットの取得(3回目) -
再度スナップショットの取得を行います。STATSPACKリポジトリの所有ユーザ「perfstat」にてプロシージャ「statspack.snap()」を実行してください。
 
※ スナップショットの取得実行結果
SQL> connect perfstat/perfstat
SQL> execute statspack.snap(i_snap_level => 7);

PL/SQL procedure successfully completed.

SQL>
 

 

  Step8 - 負荷がけの実行・性能の測定・停止 -
STEP.3STEP.4と同様の手順にて性能情報の取得を行ってください。なおここでは以下の結果が得られたものとします。
 
23:52:44 TRGT:ACTV CONN:10/10 DISC:0/10 TERM:0/10 ERR:0 TPS:10
23:52:45 TRGT:ACTV CONN:10/10 DISC:0/10 TERM:0/10 ERR:0 TPS:10
---- TRANSACTION REPORT ( SUMMARY ) ------------------

MONITORING PERIOD
~~~~~~~~~~~~~~~~~
- Begin: Tue Dec 09 23:42:46 JST 2008
- End: Tue Dec 09 23:52:45 JST 2008

THROUGHPUT
~~~~~~~~~~
Transaction nameMinMaxAverage
================ ==== ===== =======
VIEW_ITEMS15ms125ms 28.84ms
ORDER0ms 62ms 10.02ms

TPS
~~~
- Total transaction count : 5843
- Monitoring time: 600 seconds
- Average TPS: 9.74

TG>
 

 

  Step9 - スナップショットの取得(4回目) -
スナップショットの取得を行います。STATSPACKリポジトリの所有ユーザ「perfstat」にてプロシージャ「statspack.snap()」を実行してください。
 
※ スナップショットの取得実行結果
SQL> connect perfstat/perfstat
SQL> execute statspack.snap(i_snap_level => 7);

PL/SQL procedure successfully completed.

SQL>
 
これにより"インデックス無"の状態での性能情報を取得が完了しました。

 

  Step10 - TGによる性能情報の比較・分析 -
TGにより取得した性能情報の結果を比較します。左図は「インデックス有」、右図は「インデックス無」の結果です。
 
※インデックス有
---- TRANSACTION REPORT ( SUMMARY ) -----

MONITORING PERIOD
~~~~~~~~~~~~~~~~~
- Begin: Tue Dec 09 23:08:56 JST 2008
- End: Tue Dec 09 23:18:55 JST 2008

THROUGHPUT
~~~~~~~~~~
Transaction nameMinMaxAverage
================ ==== ===== =======
VIEW_ITEMS0ms109ms 4.48ms
ORDER0ms266ms 8.62ms

TPS
~~~
- Total transaction count : 5975
- Monitoring time: 600 seconds
- Average TPS: 9.96

TG>
※インデックス無
---- TRANSACTION REPORT ( SUMMARY ) -----

MONITORING PERIOD
~~~~~~~~~~~~~~~~~
- Begin: Tue Dec 09 23:42:46 JST 2008
- End: Tue Dec 09 23:52:45 JST 2008

THROUGHPUT
~~~~~~~~~~
Transaction nameMinMaxAverage
================ ==== ===== =======
VIEW_ITEMS15ms125ms 28.84ms
ORDER0ms 62ms 10.02ms

TPS
~~~
- Total transaction count : 5843
- Monitoring time: 600 seconds
- Average TPS: 9.74

TG>
 
10分間のうちに実行したトランザクションの実行数は「5975回(インデックス有)」、「5843回(インデックス無)」とほぼ差はありませんが、参照系のトランザクションである「VIEW_ITEMS」の実行にかかった平均時間が「4.48ms(インデックス有)」、「28.84ms(インデックス無)」と、インデックス無のほうが7倍近くの時間を要していたことがわかります。

 

  Step11 - STATSPACKレポートの取得 -
続いてデータベースの観点から性能情報を分析するため、STATSPACKレポートの取得を行います。SQL$Plusを使用してPERFSTATユーザにてデータベースに接続し、スクリプト「$ORACLE_HOME/rdbms/admin/spreport.sql」を実行してください。
 
※ spreport.sql実行結果
SQL> @?/rdbms/admin/spreport

             ・・・・ 中略 ・・・・

Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DB IdInst NumDB NameInstanceHost
----------- -------- ------------ ------------ ------------
24291681601TESTDB testdbdbsrv001

Using 2429168160 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 <return> without
specifying a number lists all completed snapshots.

Listing all Completed Snapshots

Snap
InstanceDB NameSnap IdSnap StartedLevel Comment
------------ ------------ --------- ----------------- ----- -------------
testdbTESTDB1 09 Dec 2008 23:08 7
2 09 Dec 2008 23:18 7
3 09 Dec 2008 23:42 7
4 09 Dec 2008 23:52 7

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap:

 
上記出力より、4つのSnapshotが取得済みであることがわかります。今回はSnap Id"1"と"2"を使用して「インデックス有」のレポートを、Snap ID"3"と"4"を使用して「インデックス無」のレポートを取得します。
 
以下の要領で各STATSPACKレポートの取得を行ってください。
 
※ spreport.sql実行結果(インデックス有)
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1 ←開始点となる「Snap Id」を指定します。
Begin Snapshot Id specified: 1

Enter value for end_snap: 2 ←終了点となる「Snap Id」を指定します。
End Snapshot Id specified: 2


Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2. To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: report1 ←任意のレポート名を入力します。

Using the report name report1

・・・・ 以下略 ・・・・

 
 
※ spreport.sql実行結果(インデックス無)
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 3 ←開始点となる「Snap Id」を指定します。
Begin Snapshot Id specified: 1

Enter value for end_snap: 4 ←終了点となる「Snap Id」を指定します。
End Snapshot Id specified: 2


Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2. To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: report2 ←任意のレポート名を入力します。

Using the report name report1

・・・・ 以下略 ・・・・

 

 

  Step12 - STATSPACKレポートの比較・分析 -
STATSPACKレポートより取得した統計情報の結果を比較します。以下は「インデックス有」、「インデックス無」の「Top 5 Timed Events」セクションの結果です。
 
※ Top 5 timed Events(インデックス有)
Top 5 Timed EventsAvg %Total
~~~~~~~~~~~~~~~~~~wait Call
EventWaits Time (s) (ms) Time
----------------------------------------- ------------ ----------- ------ ------
CPU time1444.8
db file parallel write1,2517520.8
log file sync1,1993310.2
log file parallel write1,221339.7
db file sequential read2,185217.6
-------------------------------------------------------------

 
 
※ Top 5 timed Events(インデックス無)
Top 5 Timed EventsAvg %Total
~~~~~~~~~~~~~~~~~~wait Call
EventWaits Time (s) (ms) Time
----------------------------------------- ------------ ----------- ------ ------
CPU time11492.7
log file sync1,179332.6
log file parallel write1,183322.2
control file parallel write203291.4
db file parallel write236161.1
-------------------------------------------------------------

 
「インデックス有」の場合と比較して、「インデックス無」のほうが"CPU time"に多くの時間がかかっていたことがわかります。CPU timeとは、Oracleがなんらかの処理に使用した(多くはSQLの実行のために使用した)CPU時間の総和です。つまり、「インデックス無」のほうがトランザクション(SQL)実行のために8倍近くのCPUを必用としていたことになります。
 
続いて以下は「SQL(SQL ordered by CPU)」セクションの比較結果です。
 
※ SQL ordered by CPU(インデックス有)

SQL ordered by CPU DB/Inst: TESTDB/testdb Snaps: 1-2
-> Resources reported for PL/SQL code includes the resources used by all SQL
statements called by the code.
-> Total DB CPU (s): 11
-> Captured SQL accounts for 44.7% of Total DB CPU
-> SQL reported below exceeded 1.0% of Total DB CPU

CPUCPUperElapsdOld
Time (s) ExecutionsExec (s) %TotalTime (s)Buffer Gets Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
2.855,4700.0025.42.8776,927 1431284007
select * from ITEMLIST where CATEGORY = :1


0.706180.006.30.7210,115 3439545154
insert into ORDERLIST values (SEQ_ORDER_ID.nextval, :1, sysdate)

 
 
※ SQL ordered by CPU(インデックス無)

SQL ordered by CPU DB/Inst: TESTDB/testdb Snaps: 3-4
-> Resources reported for PL/SQL code includes the resources used by all SQL
statements called by the code.
-> Total DB CPU (s): 102
-> Captured SQL accounts for 95.7% of Total DB CPU
-> SQL reported below exceeded 1.0% of Total DB CPU

CPUCPUperElapsdOld
Time (s) ExecutionsExec (s) %TotalTime (s)Buffer Gets Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
95.775,3490.02 93.5115.37 11,803,437 1431284007
select * from ITEMLIST where CATEGORY = :1

 
それぞれ該当SQL(select * from ITEMLIST where CATEGORY = :1)の実行回数(Executionsカラム)の数値はほぼ同一であるものの、"Buffer Gets"の回数が大幅に異なっている(インデックス無のほうが約150倍)ことがわかります。Buffer Getsとは、該当SQLによってデータベースバッファキャッシュから取得されたデータブロック数を示しています。

また、該当SQLが消費したCPU時間は"95.77秒"と、「Top 5 Timed Events」のCPU時間"114秒"に対して80%以上のCPU処理時間が該当SQLの実行に割かれていたことになります。

 

  Step13 - 実行計画の取得 -
続いてSQL(「select * from ITEMLIST where CATEGORY = :1」HashValue:1431284007)の詳細情報を確認するため、該当SQLの実行計画の取得を行います。SQL$Plusを使用してPERFSTATユーザにてデータベースに接続し、スクリプト「$ORACLE_HOME/rdbms/admin/sprepsql.sql」を実行してください。
 
※ sprepsql.sql実行結果(インデックス有)
SQL> @?/rdbms/admin/sprepsql

・・・・ 中略 ・・・・

Instances in this Statspack schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DB IdInst NumDB NameInstanceHost
----------- -------- ------------ ------------ ------------
24291681601TESTDB testdbdbsrv001

Using 2429168160 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 <return> without
specifying a number lists all completed snapshots.

Listing all Completed Snapshots

Snap
InstanceDB NameSnap IdSnap StartedLevel Comment
------------ ------------ --------- ----------------- ----- -------------
testdbTESTDB1 09 Dec 2008 23:08 7
2 09 Dec 2008 23:18 7
3 09 Dec 2008 23:42 7
4 09 Dec 2008 23:52 7

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1 ←開始点となる「Snap Id」を指定します。
Begin Snapshot Id specified: 1

Enter value for end_snap: 2 ←終了点となる「Snap Id」を指定します。
End Snapshot Id specified: 2


Specify the old (i.e. pre-10g) Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for hash_value: 1431284007 ←該当SQLのHashValueを入力します。
Hash Value specified is: 1431284007


Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2. To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: report3 ←任意のレポート名を入力します。

Using the report name report1

             ・・・・ 以下略 ・・・・

 
 
※ sprepsql.sql実行結果(インデックス無)
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 3 ←開始点となる「Snap Id」を指定します。
Begin Snapshot Id specified: 1

Enter value for end_snap: 4 ←終了点となる「Snap Id」を指定します。
End Snapshot Id specified: 2


Specify the old (i.e. pre-10g) Hash Value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for hash_value: 1431284007 ←該当SQLのHashValueを入力します。
Hash Value specified is: 1431284007


Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2. To use this name,
press <return> to continue, otherwise enter an alternative.

Enter value for report_name: report4 ←任意のレポート名を入力します。

Using the report name report1

             ・・・・ 以下略 ・・・・

 

 

  Step14 - 実行計画の比較・分析 -
以下は「インデックス有」、「インデックス無」のSQL(select * from ITEMLIST where CATEGORY = :1)の実行計画です。
 
※ 実行計画(インデックス有)
               ・・・・ 上略 ・・・・

% Snap
Statement Total Per ExecuteTotal
--------------- --------------- ------
Buffer Gets:76,92714.161.60
Disk Reads:1,1510.251.85
Rows processed:273,50050.0
CPU Time(s/ms):3.5
Elapsed Time(s/ms):3.5

               ・・・・ 中略 ・・・・

--------------------------------------------------------------------------------
| Operation| PHV/Object Name|Rows | Bytes|Cost |
--------------------------------------------------------------------------------
|SELECT STATEMENT|----- 3603706253 ----|||4 |
|TABLE ACCESS BY INDEX ROWID|ITEMLIST|50 |8K|4 |
| INDEX RANGE SCAN|IDX_ITEMLIST_CATEGOR |50 ||1 |
--------------------------------------------------------------------------------
 
 
※ 実行計画(インデックス無)
               ・・・・ 上略 ・・・・
% Snap
Statement TotalPer ExecuteTotal
--------------- --------------- ------
Buffer Gets:11,803,4372,206.799.89
Disk Reads:00.0.00
Rows processed:267,45050.0
CPU Time(s/ms):9617.9
Elapsed Time(s/ms):11521.6

               ・・・・ 中略 ・・・・

--------------------------------------------------------------------------------
| Operation| PHV/Object Name|Rows | Bytes|Cost |
--------------------------------------------------------------------------------
|SELECT STATEMENT|----- 1511199496 ----|||484 |
|TABLE ACCESS FULL|ITEMLIST|24 |4K|484 |
--------------------------------------------------------------------------------
 
注目したいのは以下の違いです。

・インデックス有:TABLE ACCESS BY INDEX ROWID - INDEX RANGE SCAN
・インデックス無:TABLE ACCESS FULL

「インデックス有」ではインデックスを使用したレンジスキャンが行われていたのに対し、「インデックス無」では全表検索(フルテーブルスキャン)が行われていました。

SQL1回あたりの統計情報(Per Executeカラム)でみると、50行ぶんのデータを検索するために「インデックス無」では150倍(Buffer Gets : 2,206.7/14.1)近くのデータブロック(データベースバッファキャッシュ上)を走査しています。

Oracleはインデックスが無いことから、検索対象データ取得のためにメモリーの走査を大量に行い、このため「Top 5 timed Events」の"CPU time"が増加したことがわかります。

 

     
   >> TOP > Usage
     > Verification.1
 
 
 
 

 

 
 
Copyright 2003 - 2010 tgmstr. All rights reserved.