アップグレード前後の実行計画を比較する性能試験
アップグレードを行うと、多くのSQLの性能は向上しますが、稀に性能が劣化するSQLも存在します。そのため、性能要件がとても厳しいシステムでは、アップグレード前後の実行計画を比較する性能試験を行い、性能問題の発生を可能な限り未然に防止することをお勧めします。
そこで、作業コストはかかりますが、アップグレード前後の実行計画を手動で比較する方法をお伝えします。
なお、次の章で紹介する、SQL Performance Analyzer (SPA)というオラクルのオプション機能を使用することで、少ないコストで簡単にSQL単位の性能比較を行うことが出来ます。
① 確認対象のSQL文の抽出
SQL台帳などで、確認対象のSQLをまとめていない場合は、現行環境にSQLトレースを仕掛け、実行されたSQLをロギングすることでSQL文を抽出してください。
ただし、SQLトレースを仕掛けると、抜け漏れ無く情報を取得することが可能ですが、データベースに負荷がかかります。そのため、データベースレベルではなく、対象処理が流れるセッションに対してのみ設定することを筆者はお勧めします。
② 現行バージョンのテスト環境の準備
現行環境のデータを、現行バージョンのテスト環境へ移行します。データ量の変動が激しいシステムの場合は、データ量が最も多くなるタイミングのデータを移行してください。
また、現行環境と同じ実行計画を再現するために、現行バージョンのテスト環境には、現行環境と同じ初期化パラメータを設定し、統計情報も現行環境で使用しているものを移行してください。
③ 新環境の準備
現行バージョンのテスト環境へ移行したデータと同じものを、新環境へ移行してください。
自動統計収集を行う場合は、データを移行した後に、統計情報を収集してください。ただし、統計情報が収集されるタイミングによって、実行計画が変動する可能性があるため、試験の時と同じ実行計画が本番で使用されない場合もあります。そのため、実行計画を変動させたくない場合は、統計情報を固定化することもご検討ください。
④ 実行計画の比較
現行バージョンのテスト環境と新環境でEXPLAIN PLANを使用して、実行計画を取得してください。
EXPLAIN PLANは、実際にSQLを実行せずに、オプティマイザが算出した実行計画を取得するため、データ量が多い環境でも時間をかけずに、簡単に実行計画を確認することが出来ます。
ただし、EXPLAIN PLANは、静的な情報のみで実行計画を算出するため、バインド変数の値を考慮しません。バインド変数の値を考慮して実行計画を立てる機能「バインドピーク」を無効化している場合は問題ありませんが、バインドピークを有効化している場合は、EXPLAIN PLANで確認した時と、バインド変数の値が考慮されるSQL実行時とで、実行計画が異なる場合があります。
そのため、バインドピークを有効化している場合は、バインド変数の値も準備し、実際にSQLを実行して実行計画を出力するAUTOTRACEを使用してください。
⑤ 実行性能の比較
実行計画が異なる場合は、性能が改善される変更なのか、性能が劣化する変更なのかを確認する必要があります。現行バージョンのテスト環境と新環境で実際にSQLを実行し、性能を確認してください。
一般的に、実行時間が短くなっていれば、性能が改善していると言えますが、データのキャッシュの有無や、測定状況の違いにより性能誤差が発生する場合があるので、アクセスブロック数も確認することをお勧めします。
アクセスブロック数とは、SQL文の処理中にアクセスが必要だった、Oracleデータ・ブロック数を意味し、処理効率に直結する指数です。
そのため、実行時間(ELAPSED_TIME)と、アクセスブロック数(logical reads)を比較し、両方の項目の値が削減されている場合は、性能が改善されていると判断することをお勧めします。
⑥ SQLチューニング
実行計画が変動して、性能が劣化したSQLをチューニングしてください。
従来通り、ヒント句をつけることでチューニングする方法もありますが、SQL Plan Management (SPM)を使用する、新しいチューニング方法もご検討ください。
SPMを使用すると、現行バージョンで使用していた実行計画を、SQL文を変更することなく、新環境でも再現することが可能になります。
なお、SPMを効果的に使用する方法は、次回紹介します。
このように、アップグレード前後の実行計画を比較する性能試験を実施すると、性能問題が発生する可能性があるSQLを事前に見つけることが出来ますが、これらの作業をすべて手動で実施すると、膨大な時間がかかってしまうため、現実的ではありません。
そのため、取得したSQLトレースからSQL文を抽出する作業や、実行計画の変動を確認する作業は、手動で実施するのではなく、効率的に実施するツールを作り込んでから実施することをお勧めします。