【问题标题】:Is there any advantage of joining on an indexed and non-indexed columns at the same time?同时加入索引列和非索引列有什么好处吗?
【发布时间】:2014-04-28 10:24:49
【问题描述】:

如果我在非索引列上有一个联接,在索引列的联接中添加另一个条件会有帮助吗?

例如 - 存在两个表 Table1 和 Table2。 tran_date 列已编入索引,但 tran_id 未编入索引。第二个代码会比第一个运行得更快吗?如果是这样,SQL 究竟是如何对这样的连接进行操作的? Table1 在 tran_id 上是唯一的,而 table2 在 tran_id - sku 级别上是唯一的。 另外,tran_id 是 varchar(50) 类型的列

SELECT a.tran_id, a.tran_date, b.sku
from table1 a
inner join table2 b
on a.tran_id = b.tran_id;

SELECT a.tran_id, a.tran_date, b.sku
from table1 a
inner join table2 b
on a.tran_id = b.tran_id and a.tran_date = b.tran_date;

我使用的是Oracle环境

【问题讨论】:

  • 你可能会在Database Administrators 上为这个问题寻求更好的答案,这个问题甚至可能已经在那里得到了回答。

标签: sql oracle join indexing


【解决方案1】:

这是一个非常复杂的问题,对于像 Oracle 这样的复杂数据库没有单一的答案。 Oracle 可以在几种不同的连接方法中进行选择。它选择哪种方法取决于收集的有关表的统计信息。

作为一般规则,您可以认为将列包含在索引中会提高性能;只要准备好发现这种直觉可能是错误的情况。但是,如果事务 id 上的关系是 1-0/1(最多匹配一个)并且 Oracle 实现了哈希连接算法,那么它的性能会非常好。

更糟糕的是,如果 Oracle 实现了混合连接,首先使用索引作为日期,然后对 id 进行过滤,如果有多个日期匹配导致数据成倍增加,事情可能会变得很糟糕。

如果您想了解更多有关 Oracle 如何加入的信息,可以先查看optimizer 的文档。

【讨论】:

    【解决方案2】:

    您可以检查查询的解释计划并了解正在发生的事情。

    在我的粗略看来,第二个查询应该运行得更快,因为第二个查询将更快地评估 a.tran_date = b.tran_date 条件,然后使用过滤后的行(数量可能真的很少)来评估条件 a.tran_id = b.tran_id。 因此,第二个查询要做的工作要少得多。

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多