【ORACLE】ExadataでSQLをチューニングする方法
ここではORACLEデータベースのExadataでSQLをチューニングする方法を紹介しています。
SQLの実行計画の見方や確認方法については↓で紹介していますので参考にしてください。
>>【ORACLE】SQLの実行計画の見方
>>【ORACLE】SQLの実行計画を取得する方法
ExadataでのSQLチューニング方法
基本的にはExadataであっても、チューニングの方針は大きくは変わりません。
しかし、Exadataの特性とシステムの特性を鑑みて最適な方法を検討してください。
インデックスの作成
正直、Exadataであれば、大抵の処理はインデックスがなく、テーブルフルスキャンする方が速いです。またExadataではsamartscanという機能が内部的に働くのでフルスキャンしても最終的には不要なデータは取得しません。
しかし、それはあくまである程度負荷の高い処理を行う場合です。
例えば、オンライン系の負荷の軽い処理、かつ数ミリ秒のレスポンスを争う場合においては、インデックスが有効になるケースが依然として存在します。その辺はぜひ実機で試してみて検証してほしいです。
インデックスはSQLの変更も必要なく、比較的容易にチューニングが可能です。
一番簡単な方法は、WHERE句の条件に指定されている項目をインデックスの項目にすることです。もう少し詳しい内容については「インデックスで指定する項目の順番」で紹介しています。
また、WHERE句の項目に加え、SELECT句の項目をINDEXに加えるカバーリングインデックスを使うのも手です。
Exadataの場合だと、あまりカバーリングインデックスは有効ではありません。何と言ってもI/Oの速度が速いので、カバーリングインデックスにするくらいならフルスキャンする方が速いケースが多いです。
インデックスの実装方法はこちらから
SLECT文が遅いときのインデックス作成によるチューニング方法
ヒントの追加
Exadataと言えど、実行計画が適切でない場合には処理が遅くなります。
その場合はCPU負荷も無駄に上がってしまうのでヒントによる調整が必要です。
SQLが遅い原因は、様々ですが、多くの場合はテーブルの結合順序が適切でないことがあります。
そういった場合には、ヒントを加えて結合順序を固定するようにしましょう。
具体的には、ORDEREDヒントを使います。
・SELECT /*+ORDERED*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = COL2
のように書くことで、FROMに書かれたテーブルの順番に結合するようになります。
もし任意の順番で結合したい場合はLEADINGヒントを活用しましょう。
・SELECT /*+LEADING(b,a)*/ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = COL2
のように書くことで、TAB2テーブル、TAB1テーブルの順番に結合するようになります。
SQLの書き換え
SQLは自由度が高いので、同じ結果を取得するにも、いくつも異なる書き方で実装できます。
そんなSQLでより処理速度が速いSQLの構文や条件を利用してSQLを書き換えましょう。
パラレル実行
Exadataとパラレル実行の組み合わせは、まさに鬼に金棒です。
潤沢なリソースを武器に、パラレル実行を使い倒してください。
パラレル実行は、セッション単位にパラレルするか、SQLにヒントでパラレル記述することが出来ます。
・セッション単位
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4 ;
・ヒント
SELECT /*+ PRALLEL(4) */ a.* FROM TAB1 a,TAB2 b WHERE a.COL1 = COL2
smart flash cacheの活用
私はまだ意図的に活用したことはないのですが、通常のDBでいうところのKEEPキャッシュの使い方に近いものと思います。
また利用する機会があれば、書き足したいと思います。
まとめ
Exadataであっても、基本的にチューニングの方法は変わりません。
しかし、Exadataは驚異的な性能や潤沢なリソースが持ち味です。その辺りを理解して最大限有効に活用する必要があります。
SQLのチューニングは↓でも解説していますので参考にしてください。
>>SELECT文のSQLチューニング方法まとめ