【问题标题】:Database indexing: Example数据库索引:示例
【发布时间】:2011-03-11 15:31:34
【问题描述】:

我马上就要考试了,我想知道如何解决这些关于索引的问题:

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

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

从 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为key。

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

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

b) 单独索引 B 和单独索引 A 是否有意义,而不是在 A 和 B 上设置一个索引。哪种类型的索引最好?

编辑

这是我所做的:

问题 1 A)

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

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

10^6/73= 13 699 个块用于整个关系,向上取整

索引读数: 4*n+4(n+1) n=255 向下取整

B+树的第一层= 255

第二层B+树= 255*256

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

数据读取: 如果我们假设 A=100 的概率为 1/10001,B=10 的概率相同,那么我们有:

1/10001*1/10001*10^6 向上取整 = 1 个元组

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

然后我们有 3+1 块读取

对吗?

我不知道怎么做 B)..

我真的不知道如何回答问题 2 .. 请帮帮我

【问题讨论】:

  • 如果您将您的工作展示到卡住的地步,您可能会很快得到回复。仅仅在 SO 上倾倒作业问题被认为超出了网站的发布指南。
  • 完成。我希望你们现在能帮助我。

标签: database indexing tuples relation


【解决方案1】:

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

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

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

这个最坏的例子也是你解决问题 1B 的提示。如果您有太多具有相同 B 值的值,以至于它们无法位于几个块中,则索引可能会很有用。 (你可以做精确的数学运算)。

2A 似乎并不难。如果我们没有索引,那么您需要在最好的情况下读取 1 个块,在最坏的情况下读取所有块。 (这假设 A 是唯一的。这就是 A 作为键的含义对吗?)

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

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

添加:-----------------

我关于您计算单个节点中可以拥有多少条目的注释似乎真的不正确。试试这个:(仍然来自记忆,对任何错误深表歉意)。

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

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2011-01-31
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多