前回の勉強内容
勉強のきっかけになった問題
関係データベースの表において,検索速度を向上させるために,列Zにインデックスを付与する。ア~エは,列Zの値が等しい行の数を示したものである。インデックスを付与することによって,1行当たりの平均検索速度が最も向上するものはどれか。ここで,各行は等頻度で検索されるものとする。
ア.
データ値 行の数 p 600 q 600 r 0 s 0 t 0 u 0 イ.
データ値 行の数 p 1000 q 200 r 0 s 0 t 0 u 0 ウ.
データ値 行の数 p 20 q 40 r 80 s 160 t 300 u 600 エ.(正解)
データ値 行の数 p 200 q 200 r 200 s 200 t 200 u 200 出典 : データベーススペシャリスト試験 平成21年春期 午前Ⅱ 問10
データベースのインデックスは、検索速度を向上できます。
インデックスの日本語は「見出し、しるし」です。言葉の通り「見出し」がある方が早く目的の情報を見つけられます。
関係データベースの表の列に利用者がインデックスを設定する目的はどれか。
- 外部キーの列の値を別の表の主キーの値に一致させる。
- (正解)データの格納位置への効率的なアクセスが可能となり,検索速度の向上が期待できる。
- 一つの大きなテーブルを複数のディスクに分散格納する場合,ディスク容量が節約できる。
- 列内に重複する値がないようにする。
インデックスは、どこでもいいからあればいい訳ではありません。
一般的に「レコードが多い」「値に偏りがない」項目が良いとされています。
関係データベースにおけるインデックスの設定に関する記述のうち、適切なものはどれか。
- (正解)インデックスの設定に際しては、検索条件の検討だけでなく、テーブルのレコード数についての考慮も必要である。
- インデックスの設定によって検索性能が向上する場合は、更新・削除・追加処理の性能も必ず向上する。
- インデックスの設定は、論理設計段階で洗い出された検索条件に指定されるすべての列について行う必要がある。
- 性別のように2値しかもたないような列でも、検索条件に頻繁に指定する場合は、インデックスの設定を行うほうがよい。
出典 : 応用情報技術者試験 平成22年春期 午前 問31

インデックスには種類がります。
B+木インデックスは、値を比較して検索するのが得意です。
値を探索する方法に「2分探索木」というものがあります。

真ん中の値をとって、そこから真ん中より小さいグループと大きいグループに2つに分けて・・・を繰り返して木の構造にします。
その木の構造を利用して検索した値が上にある真ん中の値より大きいか小さかで下に進む方法を決めていきます。

「2分探索木」を進化させてより高速検索できるようにしたのが「B+木インデックス」です。
「キーより大きいか小さいか?」で分岐しながら検索するので「一致検索(=)」「値の比較(>,<)」「範囲検索(between)」がお得意です。
"部品"表のメーカーコード列に対し,B+木インデックスを作成した。これによって,"部品"表の検索の性能改善が最も期待できる操作はどれか。ここで,部品及びメーカーのデータ件数は十分に多く,"部品"表に存在するメーカーコード列の値の種類は十分な数があり,かつ,均一に分散しているものとする。また,"部品"表のごく少数の行には,メーカーコード列にNULLが設定されている。実線の下線は主キーを,ピンクは外部キー*1を表す。
部品 (部品コード,部品名,メーカーコード)
メーカー (メーカーコード,メーカー名,住所)
- メーカーコードの値が1001以外の部品を検索する。
- メーカーコードの値が1001でも4001でもない部品を検索する。
- (正解)メーカーコードの値が4001以上,4003以下の部品を検索する。
- メーカーコードの値がNULL以外の部品を検索する。
出典 : データベーススペシャリスト試験 令和5年秋期 午前Ⅱ 問13
B+木インデックスが定義されている候補キーを利用して,1件のデータを検索するとき,データ総件数Xに対するB+木インデックスを格納するノードへのアクセス回数のオーダーはどれか。
ア. √X イ. (正解)logX ウ. X エ. X!
出典 : データベーススペシャリスト試験 令和5年秋期 午前Ⅱ 問4

ビットマップインデックスは、値の種類が少ない列で効果的です。
ビットマップインデックスは、「レコード」と「値」を組み合わせ表を使って「0」「1」で表したビットマップを使用します。
例えば、[性別]を管理するテーブルがあるとします。
| ID | メンバ | 性別 |
|---|---|---|
| 1 | くま | 男性 |
| 2 | かえる | 女性 |
| 3 | アブラムシ | 不明 |
| 4 | うさぎ | 女性 |
| 5 | たぬき | 男性 |
これをビットマップにするとこうなります。
| ID | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 男性 | 1 | 0 | 0 | 0 | 1 |
| 女性 | 0 | 1 | 0 | 1 | 0 |
| 不明 | 0 | 0 | 1 | 0 | 0 |
ここで[性別]列にビットマップインデックスがあるとします。
[性別]=「男性」を検索すると「10001」から「1」を検索することになります。
このビットマップインデックスは、カーディナリティが低い列に設定すると有効です。
カーディナリティは、列に含まれる値の種類の度合いです。
値の種類が少ないとビットマップインデックスの効果が高くなります。
B+木インデックスとビットマップインデックスを比較した説明のうち,適切なものはどれか。
- AND操作やOR操作だけで行える検索は,B+木インデックスの方が有効である。
- BETWEENを用いた範囲指定検索は,ビットマップインデックスの方が有効である。
- NOTを用いた否定検索は,B+木インデックスの方が有効である。
- (正解)少数の異なる値をもつ列への検索は,ビットマップインデックスの方が有効である。
出典 : データベーススペシャリスト試験 平成30年春期 午前Ⅱ 問15

ハッシュインデックスは、「=」検索がチョッパヤです。
インデックス方式のうち、キー値を基に算出して格納位置を求めるとき、異なったキー値でも同一の算出結果となる可能性があるものはどれか。
ア. B+木インデックス イ. 転置インデックス ウ. (正解)ハッシュインデックス エ. ビットマップインデックス
出典 : 応用情報技術者試験 平成22年春期 午前 問30
ハッシュインデックスでは、ハッシュ関数で得たハッシュ値とレコードの位置を一対にして保持する方法です。
なので特定の値を見つけときはハッシュ値さえ得られればすぐ特定できるので、超早いです。
残念なことに、超早い反面、否定検索(!=,<>)や比較検索(>,<)などには役立たないのです。
"売上"表への次の検索処理のうち、B+木インデックスよりもハッシュインデックスを設定した方が適切なものはどれか。ここで、インデックスを設定する列を<>内に示す。
売上(伝票番号、売上年月日、商品名、利用者ID、店舗番号、売上金額)
- 売上金額が1万円以上の売上を検索する。<売上金額>
- 売上年月日が今月の売上を検索する。<売上年月日>
- 商品名が'DB'で始まる売上を検索する。<商品名>
- (正解)利用者IDが'1001'の売上を検索する。<利用者ID>

次回の勉強内容
*1:本当の試験では「破線の下線」ですが、表現できなかったのでここでは文字色を変えています。
