数据库索引:示例

时间:2011-03-11 15:31:34

标签: database indexing tuples relation

我很快就参加了考试,我想知道如何解决这些关于索引的问题:

1.数据库由关系R(A,B,C)组成。 A和B是整数[0,10 000](每个4B),C是varchar(20)(20B)。关系R由10 ^ 6个元组组成。 blockize是2048 B。

A)如果我们询问此查询是否在B上有B + -tree索引,我们必须读取多少块(最佳和最差):

SELECT C FROM R WHERE A = 100且B = 10

B)索引A是否有意义?如果是,哪种类型的最好是哪种?

另一个类似的问题是:

2.A数据库由关系R(A,B,C)组成。 A和B是整数[0,10 000],C是varchar(150)。关系R由10 ^ 6个元组组成。 blocksize是2048 B,A,B是键。

A)如果我们询问查询“SELECT C FROM R WHERE A = 4711 and:

,我们必须在最佳和最差情况下读取多少个块?
  • 我们没有索引。
  • 我们在A和B上有一个B + -tree索引。

b)是否有意义地将B指数和A指数分开而不是在A和B上有一个指数。哪种类型的指数是最好的?

修改

这就是我所做的:

问题1 A)

元组的大小= 20 + 4 + 4 = 28 B

2048/28 = 73个元组/块向下舍入

对于整个关系,

10 ^ 6/73 = 13 699个区块,向上舍入

Indexreadings : 4 * n + 4(n + 1)< = 2048 B => n = 255向下舍入

B +树的第一级= 255 <10 ^ 6 否

B +树的第二级= 255 * 256 <10 ^ 6  否

B +树的第三级= 255 * 256 * 257> 10 ^ 6 是的,10 ^ 6元组可以放入高度为3的B +树。

Datareadings : 如果我们假设A = 100的概率为1/10001且B = 10具有相同的概率,那么我们有:

1/10001 * 1/10001 * 10 ^ 6向上舍入= 1元组

在最坏和最好的情况下:1个元组= 1个块

然后我们有3 + 1个封锁

是不是?

我不知道如何做B)..

我真的不知道怎么回答问题2 ..请帮帮我

1 个答案:

答案 0 :(得分:0)

只是一些笔记。你的1A最好的情况看起来几乎是正确的(有点,但是添加:在底部),但我认为你的块大小计算是错误的。只有(值)B和所需磁盘块的指针/引用应存储在b +索引树中。 A和C都不应该在b +树中。

你最糟糕的情况确实是错的。没有要求B是唯一的,并且在谈论最坏情况时不需要做概率。

想象一下,如果你的所有元组中B = 10会发生什么。然后你必须全部阅读它们才能找到A = 100的值。 (请记住,您被问到最佳/最差情况不是平均值。)

这个最糟糕的例子也是你解决问题1B的暗示。如果您有如此多的具有相等B值的值,并且它们不能位于几个块中,则索引可能很有用。 (你可以做精确的数学运算)。

2A看起来并不那么困难。如果我们没有索引,那么你需要在最好的情况下读取1个块,在最坏的情况下读取所有块。 (这假设A是唯一的。这就是A是关键意味着什么?)

但我对这最后一个问题感到有些困惑。如果A和B是2个不同的(外来???)键,那么它们的组合索引似乎都是错误的。

ps:几年前我为大学做过这个,所以我可能错了,但我希望我至少能给你一些思考:}

补充:-----------------

关于计算单个节点中可以有多少条目的说明似乎真的没有了。请尝试这样做:(仍然是从记忆中,对任何错误都很抱歉)。

b +树中的条目包含2个B值(最小值/最大值)和包含最小值和最大值之间值的块的磁盘块参考。因此每个条目是12个字节(假设4个字节块引用),因此您可以在每个块中存储2048/12 = 170个条目。