データへの最短ルートを確保せよ!:データベースエンジニアへの道(5)(3/4 ページ)
本連載は、ITシステム開発の現場でプログラミングやSQLのコーディングを行っているエンジニア(データベース利用者)が、データ管理者(DA)やデータベース管理者(DBA)へステップアップするための第一歩として有効な基礎知識を紹介する。(編集局)
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ツリーインデックスを作成・利用すると、さらにパフォーマンスが向上することがあります。なお、このインデックスは後述するファンクションインデックスの一種です。
組み込み関数を利用するSQL
ファンクションインデックス(列値を組み込み関数で計算した結果をキーとするインデックス)を利用することで、アクセスパスが改善することがあります。先ほどのLIKE検索の解説の例をはじめ、いろいろな組み込み関数で利用できますのでチャレンジしてください。
ソート・グループ化を行うSQL
検索条件に使用している列値によりソート・グループ化を行う場合、その列にBツリーインデックスを作成すると、アクセスパスが改善することがあります。これは、インデックス内でデータをソートして保持しているからです。
Point
WHERE句の内容とアクセスパス
- 複数の条件をつなげる場合にどのようなアクセスパスがよいか?
⇒連結索引、ビットマップ索引、UNIONの利用などの方法がある - LIKE演算子や、組み込み関数を利用しているか?
⇒パフォーマンスの劣化原因になりがちだが、アクセスパスの取り方により改善できることがある - ソート・グループ化を行っているか?
⇒索引キーがソートされていることをうまく利用すると、アクセスパスが改善されることがある
Copyright © ITmedia, Inc. All Rights Reserved.