連載
» 2004年08月25日 00時00分 UPDATE

Oracle SQLチューニング講座(3):SQLチューニングの必須知識を総ざらい(後編) (1/3)

本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局)

[倉田寛正,株式会社アゲハ]
「連載:Oracle SQLチューニング講座」のインデックス

連載目次

 前編に引き続き、SQLチューニングを行うために必要な基礎知識として、アクセスするデータ・ブロック数に大きな影響を与える結合方法の種類と、オプティマイザの実行計画の決定に影響を与える統計情報、ヒントについて説明していきます。

結合方法の種類

 正規化されたデータベースでは、必要なデータを得るために複数の表からデータを取得、ひも付ける(結合する)処理が数多く発生します。表を結合する方法にはいくつかの種類があり、それぞれの結合方法の特徴を理解することは、SQLチューニングを実施する際の重要なポイントとなります。レコードへのアクセス方法と同様に、不適切な結合方法が選択された場合には、アクセスするデータ・ブロック数が増加し、大きくパフォーマンスが劣化してしまう可能性があります。

 ここでは代表的な結合方法である、「ネステッド・ループ結合」「ソート/マージ結合」「ハッシュ結合」について説明します。

ネステッド・ループ結合

 ネステッド・ループ結合は、図1のように実行されます。

図1 ネステッド・ループ結合(クリックで拡大します) 図1 ネステッド・ループ結合(クリックで拡大します)
  1. 結合処理の基準となる外部表(図1ではDEPARTMENT表)を決定し、外部表から得られた結合条件列のデータを基に索引スキャンが行われる表を内部表(図1ではEMPLOYEE表)とする。
  2. 外部表のレコードごとに内部表にアクセスし、結合条件を満たすか検査する。
  3. 結合条件を満たすレコードを結合して結果を返す。

 ネステッド・ループ結合は、表の一部分を結合する場合に有効な結合方法で、内部表の結合条件列に索引が作成されており、その索引を使用することでデータに効率的にアクセスできる場合に使用します。

 ルールベース・アプローチでは、結合条件列に対する索引が片方の表にしか存在しない場合は、索引が存在する表が内部表となり、双方に索引が存在する場合には、FROM句の指定順番が後ろの表(図1ではDEPARTMENT表)が外部表となります。コストベース・アプローチの場合には、コスト注1に基づいて外部表が決定されます。

 どちらの表を外部表とするかによって、アクセスするデータ・ブロック数は大きく異なってきますので、結合順序が重要なポイントとなります。ネステッド・ループ結合を効率化するためには、結合を試みるレコード数がより少ない方を外部表、レコード数に大差がない場合には、結合条件列の索引スキャンがより効率的な方を内部表とする必要があります。

注1コスト

コストとは、その処理を行うために必要なリソース量を数値化したもので、統計情報を基に算出されます。オプティマイザが必要とする統計情報が取得されていない場合、Oracleが持つデフォルト値が使用されます。


ソート/マージ結合

 ソート/マージ結合は、図2のように実行されます。

図2 ソート/マージ結合(クリックで拡大します) 図2 ソート/マージ結合(クリックで拡大します)
  1. DEPARTMENT表を結合条件列(DEPARTMENT_ID列)でソートする。
  2. 次にEMPLOYEE表を結合条件列(DEPARTMENT_ID列)でソートする。
  3. それぞれの表の結果が等しいレコードを結合して結果を返す。

 ソート/マージ結合は、表の大部分を結合する場合に有効な結合方法で、図2のように、双方の表を結合条件列でソートし、結果をマージすることで対象レコードを抽出します。

 結合条件が等価条件(=)の場合、より効率的なハッシュ結合(後述します)が使用可能となりますので、結合対象が多く、なおかつ結合条件が等価条件ではない(<、<=、>、>=)場合に使用することになります。

 なお、検索条件列に索引が作成されており、事前にその索引で絞り込まれているような場合には、結合前のソート処理が不要(索引はデータをソートして保持しているため)となるため、大きく結合処理のパフォーマンスを改善できます。

ハッシュ結合

 ハッシュ結合は、図3のように実行されます。

図3 ハッシュ結合(クリックで拡大します) 図3 ハッシュ結合(クリックで拡大します)
  1. レコード数の少ない表(図3ではDEPARTMENT表)の結合条件列(DEPARTMENT_ID列)をハッシュ関数にかけ、メモリ上にハッシュ・テーブルを作成する。
  2. もう一方の表(図3ではEMPLOYEE表)の結合条件列(DEPARTMENT_ID列)をハッシュ関数にかけ、結合できるかをハッシュ・テーブルで確認する。
  3. ハッシュ値が等しいレコードを結合して結果を返す。

 ハッシュ結合は、結合条件に等価条件(=)が指定され、大量のレコード、あるいは表の大部分を結合する場合に有効な結合方法で、コストベース・アプローチの場合のみ使用可能です。

 ソート/マージ結合に比べ、事前のソート処理が不要となるため、効率的な結合方法であるといえます。

 それぞれの結合方法の特徴を理解することで、各表のレコード件数や検索の条件、対象データのヒット率などの情報を基に、対象のSQLにおける最適な結合方法を判断できます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。