Database ManagementによるOracle Databaseのパフォーマンス監視 実践編①

[前回](https://qiita.com/Western24/items/5e3cd3caebff0101f522)の記事では、Database ManagementとEnterprise Managerの機能比較を行いました。実際にDatabase Managementを使用したデータベースのパフォーマンス監視の方法について何回かに分けて紹介していきます。

Database Managementは、パフォーマンス・チューニングと運用監視系の機能にざっくり分けることができます。特にパフォーマンス・チューニングは、STS、SQLチューニング・アドバイザー、ADDMといったデータベースの機能と密接に関わっており、Oracle Databaseに馴染みのない方だとそもそも用語がよく分からないこと多いかと思いますので、実際にSQLチューニングをしながら動作確認できる手順を紹介します。

Database Managementサービスの詳細資料は[こちら](https://speakerdeck.com/oracle4engineer/oci-database-management)

## Database Managementの準備
Database Managementの有効化は、以下の記事を参考にして有効化
[OCI Database ManagementでBaseDB/ExaDB-Dのパフォーマンス監視をする](https://qiita.com/Western24/items/bac8190ee08a8b1cf339)
[OCI Database ManagementでオンプレミスのOracle Databaseのパフォーマンス監視をする](https://qiita.com/Western24/items/c391afbf51951424b35f)
[Base Database ServiceでDatabase Managementを有効化する](https://oracle-japan.github.io/ocitutorials/management/dbcs-database-management/)

## Swingbenchの準備
データベースへの負荷掛けには、お馴染み?の[Swingbench](https://www.dominicgiles.com/swingbench/)を使用する。本来は、別のVMからGUIで実行したほうが見やすいが、ここでは単にSQLチューニングできるデータベース環境を作りたいだけなので、最小で直接DBサーバー上に実行させる。

```
#swingbenchをダウンロード (実行にはJDK11以上が必要。DBのJDKを使う)
wget https://www.dominicgiles.com/site_downloads/swingbench04112023_jdk11.zip

##SOEスキーマの作成
cd swingbench/bin/
./oewizard -cs //ホスト名:ポート/サービス名 -dba "sys as sysdb
a" -dbap sysdbaのパスワード -u soe -p soeスキーマのパスワード -ts 表領域 -async_off -scale 4 -create -cl

##SOEスキーマで接続
sqlplus soe/パスワード@ホスト名:ポート/サービス名

##パフォーマンス劣化させるために意図的にIndexを削除
DROP INDEX ADDRESS_CUST_IX;
DROP INDEX CARDDETAILS_CUST_IX;

##Swingbenchの実行。ucはユーザーセッション、min/maxはトランザクション実行のシンクタイム。DBのH/Wリソースに合わせて増減させて適切な負荷に調整
./charbench -c ../configs/SOE_Server_Side_V2.xml -cs //ホスト名:ポート/サービス名 -u soe -p パスワード -uc 10 -min 0 - max 100 -v users,tpm,tps


#下記のように実行されればOK。しばらく流し続け、トランザクション(TPM)が頭打ちになったら、その値が現在のTPMの上限値として覚えておく。この環境だとTPM1400前後
Time      Users       TPM      TPS
13:30:26  [10/10]     1427     19
13:30:27  [10/10]     1414     16
13:30:28  [10/10]     1412     26
13:30:29  [10/10]     1401     19
```
- Database Managementのパフォーマンス・ハブのASH分析やSQLモニタリングのタブから、データベースに負荷がかかっていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4702f338-ed44-43f8-95c5-d7975f766ba7.png)

---
SQLチューニング・アドバイザを使ってSQLチューニングをするにはSTSを指定して実行する方法と、SQLをピンポイントで指定して実行させる方法があります。まず、オーソドックスなSTS(SQLチューニング・セット)というSQLと実行統計のセットを準備して実行する方法を紹介します。

## STSを使用したSQLチューニング・アドバイザの実行
まず初めに、STS(SQLチューニング・セット)を準備する。

- STSの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/12d7b4a8-8405-4c4f-ad28-91c6d8a3ea1b.png)

- STSに追加するSQLは、現在実行中のSQLをカーソルキャッシュから収集。収集間隔は60秒。実行にはADMINISTER SQL TUNING SET権限が必要なので、資格証明にはSYSを指定して名前をつけて保存し、作成をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/859ddb10-1a48-4057-9eed-41d604bcc849.png)


- 作成したSTSの詳細。SOEスキーマのSQLが収集できていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1be5825a-e64b-4a82-9e46-590732c49b71.png)

<br>
作成したSTSに対して、SQLチューニング・アドバイザを実行する。

- SQLチューニング・アドバイザの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/edcfc29f-24f2-4c34-9263-828e521d3ba2.png)


- 作成したSTSを選択し、実行時間は5分以内、STSで保存した資格情報を選択して実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/759a3832-5a7b-4cc6-8502-ed5549f727f1.png)

- SQLチューニング・アドバイザの実行結果のサマリー。2つのSELECT文に対して索引作成の推奨が検出されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a5ff6147-8605-4075-9e9d-d326006c7606.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4758ab43-bacf-4aec-b38a-721ae8ca9b53.png)

- 上記の画面の実行計画の比較をクリックすると、実行計画の差異を比較できる。上は元の実行計画でTABLE ACCESS、下はINDEXになっておりコストが大幅に減少しているのが分かる 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fb2d2dc8-dae1-4441-bfe9-54358a2a0bd8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/49faff46-f36b-4be3-99c7-270f2381d13e.png)

上記手順の流れのようにSTSの作成 -> チューニング・アドバイザの実行でSTS内のSQLパフォーマンス改善案を提示してくれる。STSはカーソルキャッシュだけでなく、定期実行され蓄積されているAWRスナップショットの結果を基に作成することもできる。
では、実際にSQLチューニング・アドバイザが推奨した提案を受け入れて索引を作成する。

- 後で検索に使用するのでSQL ID(g81cbrq5yamf5)をメモしておき、推奨事項を実施をクリック
以下のように、索引を作成する表領域を指定、STSで保存した資格情報を選択、ログを出力するオブジェクトストレージのバケットを指定して実装をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/6b0cdd12-915c-4a6d-92e3-161605a777fe.png)

- swingbenchのTPMの推移を見ておく。索引の作成が完了すると、TPMがおよそ2倍くらいは上昇するはず
```
TPM 1400 -> TPM 3800までUP
Time      Users       TPM      TPS
13:55:40  [10/10]     3814     51
13:55:41  [10/10]     3837     67
13:55:42  [10/10]     3852     59
```

- SQL検索からSQL IDを指定して検索。作成された索引を使用した実行計画に変更されていることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0d8648b8-7f8f-4f19-bb2a-5ae42d1d573b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3e84da66-4cb6-4560-a9c0-29a99669a4c5.png)

## 単一SQLからSQLチューニング・アドバイザの実行
- パフォーマンス・ハブのASH分析からCPU負荷が高くなっているSQL ID(7ws837zynp1zv)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/58afc7c8-3e3a-422e-9086-e2b472f8446e.png)

- 実行計画でTABLE ACCESSになっていることを確認し、SQLチューニングをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/504d2889-0d5f-4409-8ab8-92e4ec5f3b6a.png)

- SQLのソースが選択したSQLのみのピンポイントになっている点に注目。前回同様の設定で実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/eaf12d2a-73c6-4280-a83c-85fe9f23bf0c.png)

- 指定したSQLのみのSQLチューニング・アドバイザの結果。同様に索引作成の推奨がされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/27f1265c-81d6-4e35-904d-1b2cb6d2b66a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8df065e0-2a39-4647-bbcb-04ef3fcfd381.png)

- STSの場合と同様に推奨事項の実装を適用する

- swingbenchのTPMの推移を見ると最大40倍くらいは増加するはず。
 ```
TPM 3800 -> TPM 120000までUP
Time      Users       TPM      TPS
14:20:14  [10/10]     120092   1439
14:20:15  [10/10]     119711   1408
14:20:16  [10/10]     119293   1456
```

- パフォーマンス・ハブを見直すと、ASH分析での見え方が変わっている。SELECTのボトルネックが解消したので大量のSELECTを処理できるようになった反動で、今度はUPDATEのenq row lockが頻繁に発生するようになった。その結果TPMは安定しない。(※DBの環境によるが)
TPMが1300 -> 最大120000までSQLパフォーマンス改善することは分かったので、今後はどのあたりがDB性能限界なのか、安定してSQLを処理できるTPMはどれくらいなのかを調査するには、DBの設定、Swingbenchの実行パラメータの設定などを調整しながら探っていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/bee7224a-519d-4c82-a0eb-e04e4a04a391.png)

以上がDatabase ManagementのSQLチューニング・アドバイザーを使用したSQLチューニングの実行手順です。
Oracle DatabaseのチューニングではAWRレポートがよく使われるかと思いますが、同様にDatabase ManagementではAWRエクスプローラーから過去の様々なパフォーマンス情報をオンデマンドでアクセスしながら、GUIで分析しSQLチューニングに繋げていけるのでより直感的な操作が可能になるかと思います。[次回](https://qiita.com/Western24/items/d2159a7fb9ddf4072726)は、ADDM、ADDMスポットライトについて紹介します。