1

もうすぐ試験があるので、インデックス作成に関する次の質問の解き方を知りたいです。

1.データベースは関係 R(A,B,C) から構成されます。A と B は整数 [0,10 000] (それぞれ 4B) で、C は varchar(20) (20B) です。リレーション R は 10^6 タプルで構成されます。ブロックサイズは 2048 B です。

A) B に B+ ツリー インデックスがあるかどうかを次のクエリに問い合わせた場合、読み取らなければならないブロックの数 (最善と最悪) は次のとおりです。

R から C を選択 A=100 および B=10

B) A にインデックスを付けるのは理にかなっていますか? はいの場合、どのタイプのインデックスが最適ですか?

別の同様の質問は次のとおりです。

2.データベースは、関係 R(A,B,C) から構成されます。A と B は整数 [0,10 000] で、C は varchar(150) です。リレーション R は 10^6 タプルで構成されます。ブロックサイズは 2048 B で、A、B がキーです。

A) 「 SELECT C FROM R WHERE A=4711 」というクエリを実行した場合、最良の場合と最悪の場合で、読み取らなければならないブロックの数は次のとおりです。

  • インデックスはありません。
  • A と B に B+ ツリー インデックスがあります。

b) A と B に 1 つのインデックスを付けるのではなく、B と A を別々にインデックス化することは理にかなっていますか? どのタイプのインデックスが最適ですか?

編集

これが私がやったことです:

質問 1 A)

タプルのサイズ = 20+4+4=28 B

2048/28=73 タプル/ブロック切り捨て

10^6/73= リレーション全体で 13 699 ブロック、切り上げ

索引の読み: 4*n+4(n+1)<=2048 B => n=255 切り捨て

B+ツリーの最初のレベル= 255<10^6 いいえ

B+tree の第 2 レベル = 255*256<10^6 いいえ

B+tree の第 3 レベル = 255*256*257>10^6 はい、10^6 タプルは高さ 3 の B+tree に収まります。

Datareadings : A=100 の確率が 1/10001 で、B=10 の確率が同じであると仮定すると、次のようになります。

1/10001*1/10001*10^6 切り上げ = 1 タプル

最悪の場合と最良の場合: 1 タプル = 1 ブロック

次に、3+1 ブロック読み取りがあります

そうですか?

B)のやり方がわかりません。

そして、質問2の答え方が本当にわかりません..助けてください

4

1 に答える 1

0

ちょっとメモ。あなたの 1A の最良のケースはほぼ正しいように見えますが(ちょっと、しかしseが追加されました:下部に)、ブロックサイズの計算が間違っていると思います。B (の値) と必要なディスク ブロックへのポインタ/参照のみを b+ インデックス ツリーに格納する必要があります。A も C も、b+ ツリーにまったく含まれてはなりません。

そして、あなたの最悪のケースは本当に間違っています。B が一意である必要はなく、最悪のケースについて話すときに確率を行う必要もありません。

すべてのタプルで B=10 の場合に何が起こるか想像してみてください。次に、それらをすべて読み取って、A=100 の値を見つける必要があります。(平均ではなく、最良/最悪のケースが求められることを忘れないでください)。

この最悪の例は、問題 1B を解決するためのヒントでもあります。B 値が等しい値が非常に多く、それらをいくつかのブロックに配置できない場合、インデックスが役立つ場合があります。(正確な計算を行うことができます)。

2Aはそれほど難しくないようです。インデックスがない場合、最良の場合は 1 ブロックを読み取る必要があり、最悪の場合はすべてのブロックを読み取る必要があります。(これは、Aが一意であると仮定しています。これは、Aがキーであることを意味しますよね?)

しかし、私はこの最後の質問について少し混乱しています。A と B が 2 つの異なる (外部???) キーである場合、それらに結合されたインデックスを持つことは、両方とも間違っているように見えます。

ps: 大学でこれをやったのは数年前なので、間違っているかもしれませんが、少なくとも何か考えさせてくれることを願っています :}

追加した: - - - - - - - - -

1 つのノードに含めることができるエントリの数の計算についての私のメモは、本当にずれているようです。代わりにこれを試してください: (まだ記憶からなので、エラーがあれば申し訳ありません)。

b+ ツリーのエントリには、B の 2 つの値 (最小/最大) と、最小と最大の間の値を含むブロックのディスク ブロック参照が含まれます。したがって、各エントリは 12 バイト (4 バイトのブロック参照を想定) であり、各ブロックに 2048/12=170 のエントリを格納できます。

于 2011-03-12T18:06:52.243 に答える