それでは実際に、パフォーマンス・チューニングでのSQLチューニングの位置付けを見てみます。
論理設計や物理設計の変更、Oracleインスタンスの初期化パラメータの変更などOracleデータベースのパフォーマンス・チューニング方法の中で、SQLチューニングは、最も効果が期待できる手段です。場合によっては、索引の使用の有無など、SQL文を最適化することによって、数倍から数百倍のパフォーマンス向上といった、そのほかの手段では実現不可能な結果をもたらすこともできます。
SQLチューニングの処理は、Oracleインスタンスやハードウェア・リソースなどに密接にかかわっていて、パフォーマンス・チューニングの観点から見ると、これらのかかわり合いは、図3のような関係で表せます。この図の中で、SQLチューニングは最も下位に位置しています。下位の階層は、より上位の階層に対してパフォーマンスの影響を与えることを表しています。
例えば、すでに稼働中のデータベース・システムでパフォーマンスが出ないケースを考えてみます。この場合、上層に当たるOracleデータベースの初期化パラメータを調整しても、最適な値を見つけるのは難しいでしょう。
仮に非効率なSQLによって無駄なデータが数多くキャッシュにある場合などを考えてみてください。いくらキャッシュ関連の初期化パラメータを大きくしてもキャッシュの効果は少なく、メモリ・リソースを無駄にするだけで適切な対応とはいえません。そのため下位に当たるSQLに関して最適なチューニングを事前に実施して、それに合わせて初期化パラメータを調整することが、パフォーマンスを向上させる方法として望まれます。つまり、SQLチューニングを行うことが、そのほかすべてのパフォーマンス・チューニングの基礎となるのです。
SQLのチューニングを行うには、もちろんチューニングの対象となるSQLが決まっていなければなりません。しかし、実際のDBAに届くユーザーからの問い合わせの内容は、「使用しているアプリケーションなどの処理が遅い」といったように、具体的に何が遅いのかが判明しておらず、SQLの部分が遅いのかどうかが分からない、といったことが少なくありません。そこで、SQLチューニングを行うに当たって、実際に行うべき手順の概略が図4になります。
最初に、パフォーマンスの問題に直面しているユーザーから、「何の処理を行っているのか」「処理にどのくらい時間がかかっているのか」などといった状況報告と、「システム形態やアプリケーションの種類」などといった環境を確認します。
次にCPU負荷や過度のスワップ処理の発生、ネットワーク負荷などのシステム・リソースに問題がないか、アプリケーションに問題がないかなどを確認することで、問題点の切り分けを行います。これらシステムリソース全体に問題がない場合や、特定のOracleプロセスがシステムリソースを使用してるのが明確な場合などでは、SQLやインスタンスといったOracle側に問題があると判断できます。
Oracle側の問題がSQLにあった場合、必ずSQLチューニングの目標を決定します。SQLチューニングは目標を定めないと終わりのない作業になってしまうため、「レスポンスタイムが何秒以下」といった明確なゴールを決めておきます。また、SQLチューニングの作業にかけられる時間は、スケジュールなどにより限られていることが多いため、チューニングを行うべきSQLの選択、例えばCPUに負荷をかけているSQL、物理アクセス量が多いSQLなどといった作業の優先順位付けも併せて決定しておきます。
そして実際の処理の間に、SQLの詳細情報の取得を行います。また、先に説明したように、SQLのチューニングはOracleインスタンスやOSリソースの状況にもかかわってくるため、Oracleの稼働状況や、データベース・サーバのシステム・リソース情報も併せて取得します。
その後、情報を分析、適切なSQLチューニングを実施し、目標に達するまで情報取得とチューニングを繰り返します。
今回はSQLチューニングの目的と意味、チューニングを行うまでの手順の概略を紹介しました。次回はSQLチューニングを行うに当たって必要な基礎知識として、データ・アクセス方法、オプティマイザに関して説明します。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.