SQLの性能調査で苦労していませんか?
「調査する上で、どの情報を取得したらいいかわからない。」
「必要な情報が取れていなかった。」
などの経験があるのではないでしょうか。
そんなあなたにオススメしたいのがSQLHC(SQL Health Chech)です。
SQLレポートよりも情報量が多く、調査する上で十分な情報量を取得できます。
SQL実行計画の問題調査に必要な情報
実行計画変動による性能問題を調査するためには、以下の情報が必要です。
- 取得情報
- 実行計画(実行統計/実行計画変動履歴)
- オブジェクト統計情報(取得日/統計情報の内容)
- オブジェクト定義(テーブル/索引)
- 初期化パラメータ
- AWRレポート
- ヒアリング項目
- 統計情報収集オプション(ESTIMATE PERCENT/ヒストグラムなど)
- パーティション表ならパーティションメンテと統計収集のタイミング
- 昨日と今日でデータ件数の違いは?
- システム変更(初期化パラメータの変更など)
- ER図
従来は、特定SQLの調査に必要な情報を個別に取得していたが、
SQLHCでは、特定SQLの調査に必要な主な情報を一括で取得可能です。
SQLHCとは
SQLHCはオラクル提供の、SQLレスポンス調査情報取得ツールで、下記サイトからダウンロード可能です(製品ではない)。
(My Oracle Support SQLチューニング・ヘルスチェック・スクリプト(SQLHC)(ドキュメントID:1542531.1))
インストールは不要で、Zipファイルを解凍するだけです。
ファイルサイズも110KB前後と小さく、Database構築と合わせて配置しておくのがおススメです。
障害発生してから持ち込むとなると、本番環境への持ち込み申請等が発生する可能性がるので、構築段階やテスト段階で配置し、テスト時のパフォーマンス検証のときから使ってますよ〜っといった形であらかじめ配置しておくのがオススメ。
SQL*Plusから、ワンコマンドでSQLスクリプトを実行するだけで、SQLチューニングに必要な情報を網羅的に取得してくれます。
取得情報は複数のhtmlファイルに見やすく整形されて出力され、
出力結果は1つのzipファイルに格納されます。(スクリプトを実行したディレクトリに出力される)
CPU負荷:1コア使用率90%前後、実行時間2~3分程度(※検証環境で測定)
SQLHCの実行手順
- 以下のSQLを実行(SYSユーザ)し、対象SQLのSQL_IDの特定
SQL> select SQL_ID, SQL_FULLTEXT, LAST_ACTIVE_TIME
from v$sqlarea where SQL_FULLTEXT like ‘実行した処理のSQL文の一部’;
- オプションライセンスの保有に応じて、スクリプトの実行(※)
SQL> START sqlhc.sql [D|T|N] 対象SQLのsql_id;
※10g環境および11gR1環境で情報を取得する際は、スクリプトを実行するセッションで、以下のパラメータを設定してからスクリプトの実行をお願いします。
- Diagnostics Packあり:D
- Tuning/Diagnostics Packあり:T
- Tuning PackもDiagnostics Packもなし:N
(Nのみ、カーソルをキャッシュさせるため、該当の処理の再実行が必要です)
SQL> ALTER SESSION set “_cursor_plan_unparse_enabled”=FALSE;
※STARTコマンドはSQL*Plus の@(アットマーク)コマンドと同じ機能です(STARTの場合はファイルパスとの間に空白が必要)。
スクリプトを配置したディレクトリでの実行してください。
SQLHCで出力される情報一覧
取得情報 | 説明 |
---|---|
SQL文 | SQLテキスト全文 |
実行計画(キャッシュ) | 共有プールから実行計画を取得 ※statistics_;eve;=all の場合は実行統計も取得 |
実行軽買う履歴(AWR) | AWRから実行計画取得、実行計画変動履歴(変動日時) |
SQLベースライン | SPM使用時のベースラインの承認状況 |
SQL統計(キャッシュ) | SQL実行回数、実行時間、バッファ読込、ディスク読込 |
SQL統計履歴(AWR) | |
ASH(キャッシュ) | 実行計画のフェーズ別のサンプリング数 |
ASH(AWR) | |
オブジェクト統計情報 | 表、索引、列(ヒストグラム)の統計情報詳細 |
統計情報収集履歴 | 統計情報の収集日時を履歴表示 |
システム統計 | システム統計の詳細 |
オブジェクト定義 | 表、索引 |
初期化パラメータ | SQL実行時の初期化パラメータ |
SQLHC実行時の注意点
実行統計の採取について
実行計画が出力される
「sqlhc_YYYYMMDD_HH24MISS__3_execution_plans.html」
に以下の注意が記載されています。
Current Execution Plans (last execution)
Captured while still in memory. Metrics below are for the last execution of each child cursor.
If STATISTICS_LEVEL was set to ALL at the time of the hard-parse then A-Rows column is populated.
このため、実行統計を確認するためにはハードパースの際、STATISTICS_LEVELがALLに設定されている必要があります。
10053トレースについて
SQLHCを採取する際、ハードパースが行われていれば10053トレースが同時に採取されます。(11gR2以降)
【参考ドキュメント】
▼SQL Tuning Health-Check Script (SQLHC) の概要と使用方法(KROWN:159918) (ドキュメントID 1762398.1)
ファイル出力場所について
関連ファイルをzipにまとめる際、設定されたADRの場所を確認せず、ORACLE_HOMEのlog配下を確認するため、ファイルがコピーされないケースがあります。
そのため、ADR($ORACLE_BASE/diag/rdbms///trace)配下のファイルも必要に応じて手動でコピーしてください。
まとめ
一度、このSQLHCの情報量になれてしまうと、他のシステムの性能調査で
「SQLHCがあればなぁ」
なんて思うこともしばしば。
まずは、自分で使ってみることっから始め、徐々に各システムで導入してもらうように布教活動して欲しいところです。