为什么第二个查询比第一个查询更贵?

Mik*_*378 2 performance index oracle query-performance

在阅读图数据库书时,我发现了以下摘录:

在此处输入图片说明

我不明白为什么第二个查询比第一个更贵。事实上,两者都对Bob人进行过滤。

有人可以解释一下吗?

And*_*lfe 6

这本书假设 PersonFriend 是在 PersonID 上索引的,而不是在 FriendID 上。似乎还假设 Person 独立地索引 PersonID 和 Person。

如果是这种情况,第一个查询返回为

  1. {INDEX UNIQUE SCAN Person on Person => 'Bob' get back PersonID}
  2. {INDEX RANGE SCAN PersonFriend on PersonID => Alice 和 Zack 的 PersonID 取回 FriendID}
  3. {LOOP {INDEX UNIQUE SCAN Person on PersonID} 为 Alice 和 Zack}

然后第二个回来

  1. {INDEX UNIQUE SCAN Person on Person => 'Bob' get back PersonID}
  2. {TABLE ACCESS FULL PersonFriend FOR FriendID of Bob 取回 PersonID}
  3. {LOOP {INDEX UNIQUE SCAN Person on PersonID} 为朋友}

这将是一个基本的关系数据库设计错误。使用这样的关系表,您将始终索引所有键,并且两个查询的性能配置文件将无法区分(忽略值分布的变化等)。

在这一点上,作者似乎试图表明关系数据库本质上是有缺陷的。

  • 数据库“专业知识”的一个问题是它会衰减。索引通常在添加/更新/删除性能方面的成本最高,但即使如此,它实际上也不会引起注意。索引上的额外存储我也认为不明显。现在存储成本低得离谱!像这样的担忧甚至已经过时了十五年。 (3认同)
  • 是的,我会毫不犹豫地添加另一个索引。此外,如果该列有一个 FK 约束,你就疯了,因为它增加了删除 MASTER (Person) 表的成本。 (2认同)