平成30年度 秋期 午前 問29
データベース
B+木インデックスに関する問題
“部品”表のメーカコード列に対し,B+木インデックスを作成した。これによって,“部品”表の検索の性能改善が最も期待できる操作はどれか。ここで,部品及びメーカのデータ件数は十分に多く,“部品”表に存在するメーカコード列の値の種類は十分な数があり,かつ,均一に分散しているものとする。また,“部品”表のごく少数の行には,メーカコード列に NULL が設定されている。実線の下線は主キーを,破線の下線は外部キーを表す。
〔表:関係スキーマ〕
| 表 | 列(下線の種類) |
|---|---|
| 部品 | 部品コード(実線=主キー),部品名,メーカコード(破線=外部キー) |
| メーカ | メーカコード(実線=主キー),メーカ名,住所 |
- アメーカコードの値が 1001 以外の部品を検索する。
- イメーカコードの値が 1001 でも 4001 でもない部品を検索する。
- ウメーカコードの値が 4001 以上,4003 以下の部品を検索する。
- エメーカコードの値が NULL 以外の部品を検索する。
答えと解説を見る
✓ これが正解ウメーカコードの値が 4001 以上,4003 以下の部品を検索する。
解説
値が連続した狭い範囲を取り出す検索です。
部品表のメーカコード列にB+木インデックスを作ったとき、どの検索でいちばん性能改善が見込めるかを選ぶ問いです。判断の軸は二つあり、どちらも設問の条件文が用意してくれています。一つ目は、その索引の構造がその検索の形に合うかどうかです。B+木は末端に値が小さい順に並び、末端どうしが横につながっています。ですから、ある値まで木をたどって降り、そこから横へ読み進めるだけで、連続した範囲をまとめて取り出せます。等号による一致と、上限と下限で区切った範囲に強い、という性質がここから出てきます。二つ目は、その検索が表全体のうちどれくらいの割合を返すかです。索引は、ごく一部だけを取り出すときに効きます。大部分を返す検索では、索引をたどってから表へ戻る往復のほうが高くつき、先頭から順に全部読むほうが速くなってしまいます。この二つを当てると、メーカコードの値が4001以上4003以下という検索が残ります。値の種類が十分多く均一に分散しているという条件があるので、三種類分は全体のごく一部にとどまり、しかも連続した範囲なので末端を横に読むだけで済むからです。設問の条件文が肢と一対一で対応していることにも注意してください。均一に分散という条件は範囲検索を生かすために、NULLがごく少数という条件は別の肢を切るために置かれています。索引が効くのは、ごく一部を順序を手がかりに取り出すときだ、と覚えておくと判断が速くなります。
ほかの選択肢はなぜ違うのか
- アメーカコードの値が 1001 以外の部品…:メーカコードが1001以外という条件は、一種類を除いた残り全部を返します。返る行数がほぼ全件になるため、索引をたどってから表へ戻る往復のほうが割高になり、先頭から順に読むほうが速くなります。
- イメーカコードの値が 1001 でも 40…:1001でも4001でもないという条件も、二種類を除いた残り全部を返します。除く種類が一つ増えただけで、返る割合はやはりほぼ全件のままですから、索引を使って絞り込む値打ちがありません。
- エメーカコードの値が NULL 以外の部品…:NULL以外という条件は、設問がNULLの行はごく少数だと断っているので、返るのはほぼ全件になります。加えてNULLを索引に載せない製品もあり、NULLでない行を索引で絞ること自体に意味が乏しくなります。
この問題の用語
- 改善悪いところを直して、より良い状態にすること。一度で終わらせず、計画・実行・評価・見直しを繰り返して続けるのが基本です。
出典:平成30年度 秋期 応用情報技術者試験 午前 問29
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)