【问题标题】:Is there any benefit to an index when the column is only used for (hash) joining?当列仅用于(散列)连接时,索引有什么好处吗?
【发布时间】:2012-01-22 04:18:02
【问题描述】:

假设一列将仅用于连接。 (即,我不会对列进行排序,也不会单独搜索列中的特定值)......我将使用该列的唯一目的是加入另一个表。

如果数据库支持哈希连接(据我了解,它不会从索引中受益).. 那么添加索引不是完全多余的吗? (而且很浪费)?

【问题讨论】:

  • 你怎么知道数据库会(总是)使用哈希连接来连接这个表???
  • 给定适当的统计数据......我会假设基于成本的优化器足够聪明,可以在成本更高的嵌套循环(没有索引)上选择散列连接。
  • 无法保证 Oracle 将如何执行您的 SQL,解释计划可以改变,数据可以改变,统计可以改变,...
  • 通过不添加索引,还可以大大降低使用合并连接的可能性,因为这需要首先添加排序步骤。 FK 关系中的这个连接列也是因为验证 FK 可以使用索引。
  • 没有办法保证 Oracle 将如何执行您的 SQL --- 当然 .. 我假设对于小表 Oracle 甚至不会打扰散列连接,只会使用嵌套循环。 .. 但考虑到适当的统计数据,我认为在处理大量数据且没有索引的情况下,Oracle 会在嵌套循环上使用更便宜的哈希连接是合理的。

标签: sql-server oracle join indexing


【解决方案1】:

在 SQL Server 中,它仍然会阻止 Key Lookup。

如果您JOIN 对未索引的字段,服务器需要从聚集索引中获取该字段的值。

如果你JOIN在一个NC索引上,可以直接获取值,而不需要从集群中加载所有数据页(实际上是整个表)。

因此,基本上您可以节省大量 IO,因为第一步会根据非常窄的索引而不是从磁盘加载的整个表进行过滤。

【讨论】:

  • 不太清楚你的意思......无论哪种方式,哈希连接都必须遍历每个表......即通过一次表为每个连接子句生成哈希值......然后一次通过另一个表将行匹配到生成的哈希表。我几乎认为拥有一个非聚集索引(即普通的旧堆表).. 甚至会更快一些(数据在堆表中占用的空间比聚集索引少)。
  • 不,它会遍历 index 而不是表。那就是更少的数据 = 更少的页面 = 更少的 IO = 更快。
  • 也许我遗漏了一些东西 .. 但如果我遍历所有内容(100% 的行).. 拥有索引的速度提升在哪里?
  • @vicjugador 你错过了一些东西。所有索引都不相等。把它想象成一本书。如果您有一本书有一个项目列表及其所有值(聚集索引),而另一本书只有一个方面的所有不同值的列表(NC 索引),您可以容纳更多条目在每页的第二本书中,并且阅读更少的页面以获得相同的信息。 SQL 从狭窄的 NC 索引中提取的数据要少得多,并且可以更快地处理它。
  • 啊,明白了..有道理。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多