2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Statspackのレポート読み方

2
Posted at

はじめに

Oracle Databaseの性能調査をしていると、Statspackのレポートを見る機会があります。

ただ、初めてレポートを開くと、

Load Profile
Instance Efficiency Percentages
Top 5 Timed Events
SQL ordered by Gets
SQL ordered by Reads
SQL ordered by CPU
...

と大量の情報が出てきます。

私自身レポートを見た瞬間どこを見ればいいのかわからなくなりましたので、
今回は、Statspackの項目をすべて細かく説明するのではなく、性能調査をするときに、どのあたりを見ればよいのかを中心にまとめます。


1. Statspackとは

Statspackは、Oracle Databaseの性能情報を取得し、一定期間にどのような負荷が発生していたのかを確認するための機能です。

ポイントは、ある瞬間の状態を見るのではなく、2つのSnapshotの間でどのような処理が行われたのかを見ることです。

例えば、

Snapshot 100
    ↓
    1時間
    ↓
Snapshot 101

というSnapshotがあった場合、

Snapshot 100 ~ 101

の間に発生したSQL実行やI/O、待機イベントなどを確認します。

そのため、

「昨日の13:00~14:00にDBが重かった」

というような事象を調査する場合に利用できます。


2. Statspackレポートを出力する

Statspackのレポートは、spreport.sqlを使用して出力できます。

通常はPERFSTATユーザーで実行します。

SQL> conn perfstat/パスワード
SQL> @?/rdbms/admin/spreport.sql

ここで、

@?

の?は、SQL*Plus上ではORACLE_HOMEを意味します。

例えば、

ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1

の場合、

@?/rdbms/admin/spreport.sql

は、実質的に、

@/u01/app/oracle/product/19.0.0/dbhome_1/rdbms/admin/spreport.sql

を実行するイメージです。

@はSQLスクリプトを実行するための記号なので、

@ + ? + /rdbms/admin/spreport.sql

と考えると分かりやすいです。


Snapshotを指定する

spreport.sqlを実行すると、開始Snapshotと終了Snapshotを聞かれます。

Enter value for begin_snap:
Enter value for end_snap:
Enter value for report_name:

例えば、

begin_snap : 100
end_snap   : 101
report_name: statspack_100_101

と指定します。

すると、

statspack_100_101.lst

のようなレポートファイルが作成されます。

例えば、

13:00 Snapshot 100
14:00 Snapshot 101

であれば、13:00~14:00の間にDBで何が起きていたのかを調査できます。


3. Statspackはどこを見ればいい?

Statspackのレポートには大量の情報があります。

すべてを理解する必要はなく、性能調査ではまず以下のようなセクションを押さえておくと読みやすくなります。

確認箇所 主に見るもの 何が分かる?
Snapshot Begin Snap / End Snap どの時間帯の情報なのか
Load Profile Executes / Physical Reads / Physical Writes など DB全体にどの程度の負荷がかかっていたか
Top 5 Timed Events CPU time / I/O関連イベント / その他の待機イベント DBが何に時間を使っていたか
SQL ordered by Gets Buffer Gets 論理I/Oの多いSQL
SQL ordered by Reads Physical Reads 物理I/Oの多いSQL
SQL ordered by CPU CPU Time CPUを多く使用したSQL
SQL ordered by Elapsed Time Elapsed Time 実行時間の長いSQL

この表を先に確認しておくと、レポートを開いたときに、

「とりあえずこの辺を見ればいいんだな」

という感覚を持てると思います。

ここから、それぞれについて見ていきます。


4. SnapshotとLoad Profileを見る

Snapshot

まず、レポートの対象期間を確認します。

例えば、

Begin Snap:
Snap Id: 100
Snap Time: 13:00

End Snap:
Snap Id: 101
Snap Time: 14:00

となっていれば、

13:00~14:00

の1時間についてのレポートです。

StatspackはSnapshot間の統計情報を利用するため、

「このレポートはいつの性能情報なのか?」

を最初に確認しておきます。


Load Profile

次に見るのがLoad Profileです。

ここでは、対象時間帯にDBがどの程度の処理を行っていたのかを確認できます。

例えば、

Load Profile

                     Per Second       Per Transaction
                    ------------      --------------
DB Block Gets             50,000              1,200
Consistent Gets           80,000              1,900
Physical Reads             5,000                120
Physical Writes            1,000                 24
User Calls                 3,000                 72
Parses                     2,000                 48
Executes                   3,000                 72
Redo size              XXXXXXXX             XXXXXXXX

ここでは、例えば、

Executes

を見ると、SQLがどの程度実行されていたのかが分かります。

また、

Physical Reads
Physical Writes

を見ることで、物理I/Oがどの程度発生していたのかを確認できます。

ただし、

「Physical Readsが多いから問題」

というように、数字だけで良し悪しを判断するものではありません。

Load Profileでは、

「この時間帯、DBはどのくらい仕事をしていたのか?」

という全体像を把握します。


5. Top 5 Timed EventsとSQLを見る

Top 5 Timed Events

DB全体の負荷を確認したら、次に気になるのが、

「では、その負荷は何によって発生していたのか?」

というところです。

そこでTop 5 Timed Eventsを確認します。

例えば、

Top 5 Timed Events

Event                         Waits       Time(s)
---------------------------  ----------  --------
CPU time                                      3200
db file sequential read        500,000       1000
db file scattered read         100,000        400
log file sync                  20,000        200
...

この部分では、DB処理で時間を使っていた主なイベントを確認できます。

例えば、

CPU time

が大きければ、CPU処理に多くの時間を使っていた可能性があります。

db file sequential read

などのI/O関連イベントが大きければ、データファイルからの読み込みに時間を使っていた可能性があります。

log file sync

が大きければ、COMMITに関連する待機などを疑います。

ここでは、

CPUが問題なのか、I/Oが問題なのか、それとも別の待機なのか

というように、問題の方向性を確認します。


SQL ordered by Gets

SQLのランキングもStatspackを見るうえで重要です。

例えば、

SQL ordered by Gets

では、Buffer Getsの多いSQLを確認できます。

Buffer Gets    Executions    Gets per Exec
------------  ------------  -------------
10,000,000           100          100,000
 5,000,000         1,000            5,000

この場合、

Buffer Gets

が大きいSQLを確認します。

論理I/Oを大量に発生させているSQLがないか確認するために利用できます。


SQL ordered by Reads

I/Oが気になる場合は、

SQL ordered by Reads

を確認します。

例えば、

Physical Reads    Executions
---------------  -----------
5,000,000              100
2,000,000            1,000

となっていれば、

「このSQLが大量の物理読み込みを発生させていないか?」

を確認します。

特にTop 5 Timed EventsでI/O関連の待機が目立っている場合は、このランキングが参考になります。


SQL ordered by CPU

CPU負荷が高い場合は、

SQL ordered by CPU

を確認します。

例えば、

CPU Time      Executions
------------  ----------
3,000 sec          100
1,500 sec        1,000

となっていれば、

「CPUを多く使用しているSQLはどれか?」

を確認できます。

CPU負荷の原因を調査するときに便利です。


SQL ordered by Elapsed Time

SQLの実行時間が気になる場合は、

SQL ordered by Elapsed Time

を確認します。

例えば、

Elapsed Time    Executions
--------------  ----------
5,000 sec             100
2,000 sec           1,000

となっていれば、

「実行時間が長いSQLはどれか?」

を確認できます。

ただし、Elapsed Timeが長いからといって、必ずしもSQLそのものに問題があるとは限りません。

I/O待ちなど、別の要因によって時間が長くなっている可能性もあります。

そのため、Top 5 Timed Eventsなどと合わせて確認します。


6. Statspackを見て、さらに調査する

Statspackで気になるSQLを見つけたら、そこで終わりではありません。

例えば、

SQL ordered by Reads

で大量のPhysical Readsを発生させているSQLを見つけたとします。

その場合は、そのSQLについて、

  • 実行計画
  • 使用しているインデックス
  • テーブルのデータ量
  • WHERE句
  • JOIN条件

などを確認します。

例えば実行計画に、

TABLE ACCESS FULL

があれば、

「大量のデータをFULL SCANしていることが原因ではないか?」

と考えることができます。

そこから、

インデックスを作成した方がよいのか
SQLを書き換えた方がよいのか
統計情報に問題がないか

などを調査していきます。

つまり、Statspackは原因をすべて教えてくれるものではなく、調査のきっかけを作るためのものと考えると分かりやすいです。


7. まとめ

Statspackのレポートは非常に情報量が多いため、最初はどこを見ればいいのか分かりにくいです。

まずは、以下の項目を覚えておくと読みやすくなります。

確認箇所 主に見るもの 何が分かる?
Snapshot Begin Snap / End Snap どの時間帯の情報なのか
Load Profile Executes / Physical Reads / Physical Writes など DB全体にどの程度の負荷がかかっていたか
Top 5 Timed Events CPU time / I/O関連イベント / 待機イベント DBが何に時間を使っていたか
SQL ordered by Gets Buffer Gets 論理I/Oの多いSQL
SQL ordered by Reads Physical Reads 物理I/Oの多いSQL
SQL ordered by CPU CPU Time CPUを多く使用したSQL
SQL ordered by Elapsed Time Elapsed Time 実行時間の長いSQL

Statspackで重要なのは、

「今調査したい問題に対して、どの情報を見れば原因に近づけるか」

だと思っています。

Statspackは、性能問題の原因を直接教えてくれるというより、「どこを詳しく調査すればよいか」を見つけるための材料として使うと分かりやすいと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?