データへの最短ルートを確保せよ!データベースエンジニアへの道(5)(3/4 ページ)

» 2006年07月22日 00時00分 公開
[吉田知史アクセンチュア・テクノロジー・ソリューションズ]

WHERE句の内容に着目しよう

 WHERE句の中にはさまざまな条件が盛り込まれます。それを考慮したうえで最適なアクセスパスを見つけ出す必要がありますが、ここでは、以下の3つのケースにおいて、どんなアクセスパスが最短ルートの候補になるかを解説します。

  • 検索条件が複数ある場合
  • 特殊な演算子を使用する場合
  • ソート・グループ化を行う場合

検索条件が複数ある場合

 検索条件が1つである場合、条件を与えられた列のインデックスを使用するか、しないかだけを検討すればよいのですが、検索条件が複数含まれる場合は事情が複雑になります。ここではさらに、ANDで複数の条件をつなげるケースと、ORで複数の条件をつなげるケースに分け、どんなアクセスパスが最短ルートの候補になるかを解説します。

(1)ANDの結合

  • 一番絞り込める列にインデックスを使用するアクセスパス
    すでに述べたように、インデックスは検索結果件数が少ないほど使用効果は高いので、データ分布を考慮し、対象データをより絞り込める列のインデックスを利用するアクセスパスが候補になります。
    すでに述べたように、インデックスは検索結果件数が少ないほど使用効果は高いので、データ分布を考慮し、対象データをより絞り込める列のインデックスを利用するアクセスパスが候補になります。
  • 連結索引を利用するアクセスパス
    検索条件となる複数の列を連結したインデックスを利用することで、複数の検索条件による絞り込みを1つのインデックスで行うことができます。この場合、連結の先頭に来る列を検索条件に入れない場合は、そのインデックスが使用されなくなるので注意が必要です。
    検索条件となる複数の列を連結したインデックスを利用することで、複数の検索条件による絞り込みを1つのインデックスで行うことができます。この場合、連結の先頭に来る列を検索条件に入れない場合は、そのインデックスが使用されなくなるので注意が必要です。
  • ビットマップインデックスを利用するアクセスパス
    ビットマップインデックスを検索対象の列それぞれに作成すると、それらを順にAND結合して評価することで、アクセス効率を向上させることができます。
    ビットマップインデックスを検索対象の列それぞれに作成すると、それらを順にAND結合して評価することで、アクセス効率を向上させることができます。

(2)ORの結合

  • ビットマップインデックスを利用する
    ビットマップインデックスを検索対象の列それぞれに作成すると、それらを順にOR結合して評価することで、アクセス効率を向上させることができます。
    ビットマップインデックスを検索対象の列それぞれに作成すると、それらを順にOR結合して評価することで、アクセス効率を向上させることができます。
  • UNIONを利用するSQLに書き換える
    ORを使う代わりに、検索条件となる列それぞれにBツリーインデックスを作成し、それぞれの列を検索条件とするSQLをUNION結合させることで、アクセスパスを効率化させることができます。
    ORを使う代わりに、検索条件となる列それぞれにBツリーインデックスを作成し、それぞれの列を検索条件とするSQLをUNION結合させることで、アクセスパスを効率化させることができます。

LIKE演算子を利用するSQL

 LIKE演算子を利用する場合、パフォーマンスが劣化することがたびたびあります。

後方不一致の場合、Bツリーインデックスを範囲検索にて利用できますが、厄介なのは前方不一致検索です。1つの対処法は、インデックスをフルスキャンすることです。また、図5のように検索文字列を組み込み関数REVERSEで反転し、その結果をキーとするBツリーインデックスを作成・利用すると、さらにパフォーマンスが向上することがあります。なお、このインデックスは後述するファンクションインデックスの一種です。

図5 ファンクションインデックスを利用したLIKE検索のアクセスパスの改善

組み込み関数を利用するSQL

 ファンクションインデックス(列値を組み込み関数で計算した結果をキーとするインデックス)を利用することで、アクセスパスが改善することがあります。先ほどのLIKE検索の解説の例をはじめ、いろいろな組み込み関数で利用できますのでチャレンジしてください。

ソート・グループ化を行うSQL

 検索条件に使用している列値によりソート・グループ化を行う場合、その列にBツリーインデックスを作成すると、アクセスパスが改善することがあります。これは、インデックス内でデータをソートして保持しているからです。

Point 

WHERE句の内容とアクセスパス

  • 複数の条件をつなげる場合にどのようなアクセスパスがよいか?
    ⇒連結索引、ビットマップ索引、UNIONの利用などの方法がある
  • LIKE演算子や、組み込み関数を利用しているか?
    ⇒パフォーマンスの劣化原因になりがちだが、アクセスパスの取り方により改善できることがある
  • ソート・グループ化を行っているか?
    ⇒索引キーがソートされていることをうまく利用すると、アクセスパスが改善されることがある

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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