投稿する

H31設問3 (2) [0306]

 ガンキンさん(No.1) 
お世話になります。

空欄pについて質問です。
参考書にはローカル索引に「1ヶ月のログ」の’年月’を持っていないので索引探索ができないとありますが、案Dのローカル索引は{店番、機番、年月、ログID}であり’年月'の索引を持っているので索引探索ができるのではないかと考えてしまいます。

ソートの順番が重要なのでしょうか?
仮に案Dのローカル索引が{年月、店番、機番、ログID}であった場合は索引探索ができるのでしょうか?
索引探索について詳しい方がいれば是非教えていただきたいです。
2022.08.12 01:13
にゃんちゃんさん(No.2) 
DB シルバーマイスター
問題用紙10ページ~11ページにまたがる部分が該当する記述です。
「また、WHERE句の述語に、ローカル索引の先頭を指定すると、ローカル索引によって区分内を探索することができる」

案Dのローカル索引{店番、機番、年月、ログID}
処理5のSQL文のWHERE句のイメージ「WHERE 年月 = "202207"」
ということで、ローカル索引の先頭(=店番)を指定していないので表探索になります。

>案Dのローカル索引が{年月、店番、機番、ログID}であった場合は索引探索
おっしゃる通りです。


生成される複合インデックスについては以下のようなイメージです。
■{店番、機番、年月、ログID}の場合
1001-2501-201901-101
1001-2501-202003-102
1002-2501-202110-101
1002-2502-202003-102
1003-2502-202201-103

WHERE 店番 = "1002"とすると
インデックスが1002から始まる行だけに絞り込んで、探索することができます。
WHERE 年月 = "202003"とすると
どのインデックスが該当するのか絞り込めず、表探索になります。
インデックスの前方一致なら索引検索ができるイメージです。
※一応、[RDBMSの主な仕様]の記述を読んで確認した方が間違いないかと思います。

「複合インデックス  定義順」でGoogle検索すると、図解の分かりやすいサイトが出てきます。
※外部のリンク貼り禁止のため、ご自身で検索お願いします。
2022.08.12 13:07
 ガンキンさん(No.3) 
にゃんちゃんさん詳しく解説していただきありがとうございます。

インデックスの前方一致なら索引検索ができるイメージは説明のおかげで理解できましたが、もう一つ質問よろしいでしょうか。

処理4の場合、’店番'、’年月'をwhere句で指定していると思うのですが案Dの索引が{店番、機番、年月、ログID}の順番で’店番'と'年月’の間に’機番’があるにも関わらず索引探索ができています。

上の表をお借りして
■{店番、機番、年月、ログID}の場合
1001-2501-201901-101
1001-2501-202003-102
1002-2501-202110-101
1002-2502-202003-102
1003-2502-202201-103

WHERE 店番 = "1002"とすると
インデックスが1002から始まる行だけに絞り込んで、探索
次にWHERE句で年月を指定する場合
案Dの索引の順番的に店番→機番なので
どのインデックスが該当するのか絞り込めず、表探索になると考えてしまいます。

なぜ案Dが処理4で索引探索になるのか、分かる方がいれば是非教えて頂きたいです。
2022.08.12 17:11
にゃんちゃんさん(No.4) 
DB シルバーマイスター
WHERE 店番 = "1002" AND 年月 = "202207"
とした場合ですよね。

インデックスの店番の部分だけを索引探索で絞り込み
その中で、年月が202207に一致する行を順に探索することになります。

WHERE 店番 = "1002" AND 機番 = "2501"
とすれば、インデックスの前方が店番・機番まで一致する行に絞り込みができます。
2022.08.12 19:46
 ガンキンさん(No.5) 
にゃんちゃんさん回答いただきありがとうございます。

大変わかりやすく解説していただきありがとうございます!

ーーーーーーーーーーーーーーーーーーーーーー
’店番'、’ログID'をwhere句で指定
ローカル索引が{店番、機番、年月、ログID}
ーーーーーーーーーーーーーーーーーーーーーー
つまり、上記のようにwhere句の述語に、ローカル索引の先頭が指定されており、他の指定する属性もローカル索引中に含まれているので索引探索ができるという認識で問題ないでしょうか?

重ね重ね申し訳ありませんがよろしくお願いいたします。
2022.08.12 22:23
にゃんちゃんさん(No.6) 
DB シルバーマイスター
ーーーーーーーーーーーーーーーーーーーーーー
’店番'、’ログID'をwhere句で指定
ローカル索引が{店番、機番、年月、ログID}
ーーーーーーーーーーーーーーーーーーーーーー
つまり、上記のようにwhere句の述語に、ローカル索引の先頭が指定されており、他の指定する属性もローカル索引中に含まれているので索引探索ができるという認識で問題ないでしょうか?

■回答
ローカル索引の先頭が指定されているから索引探索ができる、は合っています。
他の指定する属性は関係ありません。
インデックスを使ってくれる、使ってくれないはデータベース製品やクエリの内容によって異なる場合があり、実際は実行計画を見ないと分からないかと思います。

WHERE 店番 = "1001" AND ログID = "101"
この場合は以下の通りです。
・探索方法:索引探索
・探索行数:店番1001まではインデックスで絞り込みされる。
  その行数内はすべて探索して、ログIDが101のレコードを探す。
2022.08.13 00:07
 ガンキンさん(No.7) 
にゃんちゃんさん回答いただきありがとうございます。

> ローカル索引の先頭が指定されているから索引探索ができる、は合っています。他の指定する属性は関係ありません。
とのことですが

案E 処理4の場合
ーーーーーーーーーーーーーーーーーーーーーー
’店番'、'年月'を指定
ローカル索引が{店番、ログID}
ーーーーーーーーーーーーーーーーーーーーーー
上記の場合はローカル索引の先頭が指定されているので索引探索はできるが、
'年月'がローカル索引に含まれていないので結果的に1区分の最大探索ページ数1Mになるということでしょうか?

理解が浅く、御門違いのことを言ってるかも知れませんがよろしくお願いします。
2022.08.13 15:03
にゃんちゃんさん(No.8) 
DB シルバーマイスター
おっしゃるとおりです。

全体60区分、60Mページに対して

①区分キーによる絞り込み
WHERE句で指定する1店番の区分だけに絞られます。

②索引での絞り込み
索引探索は使用できますが、既に絞り込まれた1店番までしか絞り込みできないので
1区分全体の60Mページを探索して、対象年月を探すことになります。

この②をさらに索引で絞り込みできるように
{年月,店番}を索引にすれば、年月でも絞り込みできて探索行数を減らせるんじゃないか?
というのが設問3(2)の列名の問題です。
2022.08.13 23:01
にゃんちゃんさん(No.9) 
DB シルバーマイスター
誤「1区分全体の60Mページを探索して、対象年月を探すことになります。」
正「1区分全体の1Mページを探索して、対象年月を探すことになります。」
です。
2022.08.13 23:02
 ガンキンさん(No.10) 
にゃんちゃんさん回答いただきありがとうございます。

複合インデックスの索引についてやっと理解できました。何度も回答していただき本当に感謝してます。
2022.08.14 01:19
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2016-2024 データベーススペシャリストドットコム All Rights Reserved.

Pagetop