複数のテーブルを対象とするSQLの場合、結合の仕方に応じてどんなアクセスパスが適しているか、どうすればアクセスパスが改善できるかを解説します。
(1)ネステッドループ結合
非常によく利用される結合方法です。ネステッドループ結合は、一方のテーブルの検索結果の結合列をキーに、他方のテーブルをインデックススキャンする方法です。最初に検索するテーブルを駆動表といい、駆動表が小さいほどパフォーマンスは良好です。
(2)ハッシュ結合
これは、駆動表の検索結果をメモリにキャッシュし、他方のテーブルの全件を検索、メモリから最初のテーブルの情報にアクセスする方法です。メモリに駆動表の内容が十分収まる場合、ネステッドループ結合より高速であることがあります。
(3)ソート・マージ結合
両方のテーブルをフルスキャンして、ソート、マージするという方法です。テーブル内の少量のレコードを取得する場合は使用すべきではありませんが、テーブル内のほとんどのレコードを検索対象とする場合には利用することがあります。
以下のアクセスパスが適しています。
すべてのレコードを取得する方のテーブルを駆動表とし、フルスキャンする
他方のテーブルの結合列にあるBツリーインデックスを利用し、外部表とネステッドループ結合する
副問い合わせを利用することで複雑なデータ検索をできることがあります。しかし、複雑な検索ができる分、パフォーマンスが悪化することがあります。副問い合わせをしないSQLに書き換えることもしばしば可能なので、書き換えも試しつつアクセスパスを検討してください。
ここまで各種のSQLについて最適なアクセスパスを見つけ出す手法を説明しましたが、皆さんが最適なアクセスパスを見つけ出しても、RDBMSが同じことができなければ意味がありません。そこでここでは、RDBMSに最適なアクセスパスを利用させるためのポイントを紹介します(図6)。
特にデータ件数に変化があったり、データ内容にばらつきがあったりする場合、テーブル件数やデータ分布の統計情報を利用して、適宜実行計画に反映させることが有効です。
オプティマイザの動作/テーブル結合方法/使用インデックス/テーブルアクセス方法などさまざまなものをヒントによって制御できます。例えば、複数の検索条件をANDで結ぶ場合、「AND_EQUAL」というヒントを利用すると、複数の列それぞれのBツリーインデックスから取得したROW_IDをマージして、テーブルからレコードを取得するというアクセスパスを実現できます(図7)。
SQLのアクセスパスを作るオプティマイザの動作設定そのものや、メモリなどのリソース管理設定を変えることで、オプティマイザの動きを規制できます。
ストアドアウトラインという機能を使うと、実行計画をRDBMSに保存できます。RDBMSのリソースチューニングや、統計情報の変化があっても一貫して同じ実行計画を利用できます。ERPパッケージなどから発行されるSQLで、SQLそのものにヒントを追加できないような場合などに有用です。
パフォーマンス・チューニングはハードルが高いと感じる方もいるかもしれません。確かにパフォーマンス・チューニングは奥が深いですし、その一部にすぎないSQLチューニングも奥が深いです。しかし、SQLプログラミングを行う段階でもアクセスパスの効率を考慮しているかどうかで、その後のパフォーマンス・チューニングの作業負荷が大きく変わります。そこでまずは、SQLを書くという作業の中で、パフォーマンス・チューニングの世界に入ってみてはいかがでしょうか。そのときに、この記事が参考になれば幸いです。
次回で本連載も最終回を迎えます。最終回ではバックアップ・リカバリの重要性を解説します。お楽しみに。
アクセンチュアから生まれた、企業改革のためのシステム開発を手掛けるエンジニア集団。安間裕が代表取締役社長を務める。下平浩由はネットワーク、データベースなどのインフラ/ミドルウェアに精通したシニア・システム・アナリスト。ネットワークエンジニア、Javaシステム開発者を経て、現在はパッケージシステムの分野でSAPの導入に携わっている。
Copyright © ITmedia, Inc. All Rights Reserved.