如果我在非索引列上有联接,是否会在索引列帮助的联接中添加另一个条件?
例如 - 两个表存在Table1和Table2。列tran_date已编制索引,但tran_id不是。第二个代码会比第一个代码运行得更快吗?如果是这样,SQL如何在这样的连接上完全运行?表1在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;
VS
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环境
答案 0 :(得分:1)
您可以查看查询的解释计划,并了解正在发生的事情。
我粗略地认为第二个查询应该运行得更快,因为第二个查询将更快地评估a.tran_date = b.tran_date条件方式,然后使用过滤后的行(数量可能非常少)来评估condition a.tran_id = b.tran_id。 因此,第二个查询必须做的工作少得多。
答案 1 :(得分:1)
这是一个非常复杂的问题,对于像Oracle这样的复杂数据库没有单一的答案。 Oracle可以选择几种不同的连接方法。它选择哪种方法取决于收集的关于该表的统计数据。
作为一般规则,您可以认为包含索引的列将提高性能;只是准备好找到这种直觉可能是错误的情况。但是,如果事务ID的关系是1-0 / 1(最多一次匹配)并且Oracle实现了一个散列连接算法,那么这将表现得非常好。
更糟糕的是,如果Oracle实现了混合连接,首先使用日期索引,然后对id进行过滤,如果有多个日期匹配导致数据繁殖,事情可能会变坏。
如果您想了解有关Oracle如何加入的更多信息,可以先查看optimizer的文档。