ここから本文です

インデックスを使用したDBでの検索処理について質問です。

質問者

nrc52372さん

2010/6/1903:28:51

インデックスを使用したDBでの検索処理について質問です。

SymfoWare/RDB(富士通)を使用しています。

RDB(リレーショナルデータベース)の勉強をしているのですが
仮にインデックス定義を

IX(A1,A2,A3)

の順番として
SQL文のWHERE句で

SELECT X(取り出したい項目) FROM 表
WHERE A1=X1 AND A2=X2 AND A3>=X3

SELECT X(取り出したい項目) FROM 表
WHERE A1=X1 AND A2>=X2 AND A3=X3

とした2パターンあったとして
どうインデックスは使われるかを自分で考えたのですが…

1、上のパターンはA1=X1 AND A2=X2 AND A3>X3の順番にインデックスを
使ってデータを検索し最終的にデータ部にアクセスする

2、下のパターンは「>=」を使った条件式がWHERE句の2番目に有るので
A1=X1 AND A3=X3 AND A2>X2の順番でインデックスを使い
データ部にアクセスする

3、基本インデックスを定義されている順番に「=」で条件式が設定されているものを
先頭からWHERE句に記述しなくてならない

ここまででもう違うでしょうか?

何が知りたいかは…
・最適なアクセスパスを使った時と使わなかった時でそれぞれインデックス部内で
A1,A2,A3でヒットする件数はどう変わってくるか?
・WHERE句で「=」と「>=」を使う時の順番でインデックスがどう倒れて、どう処理効率が変わるか?

自分で調べたいのですが本屋に言ってもORACLEとかの本ばかりで見てみると
同じ様な本があるにはあるのですが、とりあえずどんなものか意見を聞きたい思い
質問してみました。(見た本は「ジョブチューニング」とかが載っている本でした)

上の質問で何か言えることが有ればそれを
「何を言いたいのか分からん」とあれば、何か一から勉強できる良い本を
教えていただけると助かります。

あとどのDBでもSQL文とかインデックスの考え方とかって大体似ているものでしょうか?
それとも全然違う?

その辺ももし良ければお願いします。

この質問は、活躍中のチエリアンに回答をリクエストしました。

閲覧数:
2,046
回答数:
1

違反報告

ベストアンサーに選ばれた回答

2010/6/1919:40:05

まず、SymfoWaraの質問を、「Oracle」のカテゴリで質問するのはやめましょう。
「データベース」直下で、質問するようにしてください。

どのようなアクセス計画を作るかは、

(1)インデクスの定義
(2)検索条件
(3)母体件数と検索対象件数
(4)インデクスのキー値の重複度合い
(5)ソートを要する処理

などによって異なってきます。

(3)、(4)を利用せず、検索条件などからだけでアクセス計画を決めるものを「構文ベース(ルールベース)最適化」、(3)、(4)を含めて決めるものを「コストベース最適化」といったように呼ばれます。

商用RDBMSが世の中に出始めた1980年代後半くらいから、長い歴史を持つRDBMSでは、IBMのDB2を除いて両方を実装しているものが多いです。

> IX(A1,A2,A3)

3列の複数列(マルチカラム)インデクスということですよね?
一言でインデクスといっても、B-TREE構造だけでなく、ハッショ、ビットマップなどいろいろあるのですが、より一般的なB-TREE構造で説明します。

A1、A2、A3について、インデクスを活用できる検索条件を指定すると、例えば、次のように対象を絞り込んで行きます。

(1)B-TREEインデクス上で、A1のキー値で範囲を絞り込み
(2)(1)で絞り込んだ範囲のB-TREEインデクス上で、A2のキー値で範囲を絞り込み
(3)(2)で絞り込んだ範囲のB-TREEインデクス上で、A3のキー値で範囲を絞り込み
(4)データ部を見る必要がある場合は、(3)で絞り込んだ範囲の行にアクセス

> A1=X1 AND A2=X2 AND A3>X3

この場合は、インデクス上でA1、A2で範囲を絞り込み、その範囲でA3>X3をインデクス上でサーチするといった方法になる可能性が高いです。
ここでは、A1、A2の条件により、A3をサーチする範囲の終端が決められることに意味があります。

> A1=X1 AND A3=X3 AND A2>X2

この場合は、インデクス上でA1で範囲を絞り込み、その範囲でA2>X2をサーチしていき、A3=X3となるものをサーチするといった方法になる可能性が高いです。
ここでは、A2>X2をサーチしていく必要がありますが、その範囲の終端がA1の条件により決められることに意味があります。

「可能性が高い」としているのは、母体データ件数、キー値の重複度合いなどにより、オプティマイザが「インデクスを使わない方が速い」と判断することがあり得るからです。

> 基本インデックスを定義されている順番に「=」で条件式が設定されているものを先頭からWHERE句に記述しなくてならない

インデクスを構成する先頭列から、「=」条件など、より絞込みができる検索条件を指定することで、絞込み効果が高くなります。

しかし、例えば母体データ件数が非常に少ない場合や、「A1=X1のデータが多量に存在する」といったケースでは、インデクスを使う効果が低い、インデクスを使わずテーブルスキャン(テーブルのデータ部をサーチ)した方が速いといったこともあり得ます。コストベースを使った場合は、そういった判断をオプィマイザが行うこともあります。

また、ハッシュインデクスなどでは、インデクスキー値からハッシュしますから、すべてのインデクスキー値に「=」条件が必要になります。

この質問は投票によってベストアンサーに選ばれました!

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する