R2 PMⅡ 問1 設問1(1)
まるさん
(No.1)
索引を構成する列名を定義順に答える問題であり、
解答例では「世帯区分、地域コード」となっているのですが、
世帯区分は3桁の半角英数字、地域コードは4桁の半角英数字と定義されていることから、
カーディナリティが高い順に定義することを考慮すると
「地域コード、世帯区分」の順に定義する方が良い気がします。
なぜ「世帯区分、地域コード」が正解となるのか、どなたか教えて頂けますでしょうか。
解答例では「世帯区分、地域コード」となっているのですが、
世帯区分は3桁の半角英数字、地域コードは4桁の半角英数字と定義されていることから、
カーディナリティが高い順に定義することを考慮すると
「地域コード、世帯区分」の順に定義する方が良い気がします。
なぜ「世帯区分、地域コード」が正解となるのか、どなたか教えて頂けますでしょうか。
2022.09.04 17:27
にゃんちゃんさん
★DB シルバーマイスター
(No.2)
回答に関わる重要な情報を以下に抜粋します。
P.7 図2 住居テーブル
地域コード列:外部キー
世帯区分列:主キーでも外部キーでもない
P.8 表2-処理2
比較対象住居は
①同じ地域
②同じ世帯区分
③同じ地域かつ同じ世帯区分
のいずれか
p.8 RDBMSの仕様 1-(6)
索引探索が選択されるためには、WHERE句又はON句のANDだけで結ばれた一つ以上の列値比較の述語の対象列が、索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。
P.11 テーブル定義表の作成(5)
主キー及び外部キーには、索引を定義する。
***************************
処理2のSQL文について
比較対象住居の絞り込みは3通りあり、それぞれ以下の通りです。
①同じ地域
WHERE 地域コード = "1001"
②同じ世帯区分
WHERE 世帯区分 = "123"
③同じ地域かつ同じ世帯区分
WHERE 地域コード = "1001" AND 世帯区分 = "123"
ここで、地域コードは外部キーであり索引が定義されているため
①は索引探索になっているはずです。
ということで世帯区分にも索引を定義してあげれば、②が索引探索になります。
ところがどっこい、③が問題で
地域コードだけ・世帯区分だけの絞り込みではなく、地域コードと世帯区分で索引により絞り込めるようにしないといけません。
そのために
{世帯区分}
{地域コード,世帯区分}
の索引を定義してあげれば、②も③も索引探索だけで絞り込みができます。
・・・が、索引を2つも追加で定義しなくても実はよくて
{世帯区分,地域コード}を定義しさえすれば③はもちろん、②でも索引探索になります。
それは以下の条件があるからです。
p.8 RDBMSの仕様 1-(6)
索引探索が選択されるためには、WHERE句又はON句のANDだけで結ばれた一つ以上の列値比較の述語の対象列が、索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。
WHERE 世帯区分 = "123"
というのは、{世帯区分,地域コード}の先頭と一致しているため索引探索が有効となります。
以上から、追加で1つだけ索引を定義するなら{世帯区分,地域コード}となります。
P.7 図2 住居テーブル
地域コード列:外部キー
世帯区分列:主キーでも外部キーでもない
P.8 表2-処理2
比較対象住居は
①同じ地域
②同じ世帯区分
③同じ地域かつ同じ世帯区分
のいずれか
p.8 RDBMSの仕様 1-(6)
索引探索が選択されるためには、WHERE句又はON句のANDだけで結ばれた一つ以上の列値比較の述語の対象列が、索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。
P.11 テーブル定義表の作成(5)
主キー及び外部キーには、索引を定義する。
***************************
処理2のSQL文について
比較対象住居の絞り込みは3通りあり、それぞれ以下の通りです。
①同じ地域
WHERE 地域コード = "1001"
②同じ世帯区分
WHERE 世帯区分 = "123"
③同じ地域かつ同じ世帯区分
WHERE 地域コード = "1001" AND 世帯区分 = "123"
ここで、地域コードは外部キーであり索引が定義されているため
①は索引探索になっているはずです。
ということで世帯区分にも索引を定義してあげれば、②が索引探索になります。
ところがどっこい、③が問題で
地域コードだけ・世帯区分だけの絞り込みではなく、地域コードと世帯区分で索引により絞り込めるようにしないといけません。
そのために
{世帯区分}
{地域コード,世帯区分}
の索引を定義してあげれば、②も③も索引探索だけで絞り込みができます。
・・・が、索引を2つも追加で定義しなくても実はよくて
{世帯区分,地域コード}を定義しさえすれば③はもちろん、②でも索引探索になります。
それは以下の条件があるからです。
p.8 RDBMSの仕様 1-(6)
索引探索が選択されるためには、WHERE句又はON句のANDだけで結ばれた一つ以上の列値比較の述語の対象列が、索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。
WHERE 世帯区分 = "123"
というのは、{世帯区分,地域コード}の先頭と一致しているため索引探索が有効となります。
以上から、追加で1つだけ索引を定義するなら{世帯区分,地域コード}となります。
2022.09.04 22:31
にゃんちゃんさん
★DB シルバーマイスター
(No.3)
なので
{地域コード,世帯区分}だと②で索引探索にできない
という理由で不可となります。
カーディナリティを考慮して効率よくインデックスを定義する、という観点ではGOODとなりますが
1つだけ索引を追加する&①②③すべて索引探索にする、という条件を満たせなくなります。
{地域コード,世帯区分}だと②で索引探索にできない
という理由で不可となります。
カーディナリティを考慮して効率よくインデックスを定義する、という観点ではGOODとなりますが
1つだけ索引を追加する&①②③すべて索引探索にする、という条件を満たせなくなります。
2022.09.04 22:36
まるさん
(No.4)
丁寧にご説明いただきありがとうございます。
条件を見落としていたようで、解答に納得しました。
条件を見落としていたようで、解答に納得しました。
2022.09.05 21:19
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。