多列上的连接条件与连接列上的单连接?

pax*_*nto 4 sql oracle join dbvisualizer

我观察到有两种方法可以在多个表上实现目标。结果集中的一列将被更新,可能需要速度。结果集通过以下方式获得:

情况1:

select ert.* 
from eval_rep_track ert
inner join 
(
        select erp.evaluation_fk, erp.report_type, LTRIM(erp.assign_group_id, '/site/') course_name
        from eval_report_dup@prod erp
        inner join eval_report er
        on er.id = erp.id
        where erp.status='queue'
        and er.status='done'
) cat

on ert.eval_id || '.' || ert.report_type || '.' || ert.course_name = cat.evaluation_fk || '.' || cat.report_type || '.' || cat.course_name;
Run Code Online (Sandbox Code Playgroud)

或者

案例2:

select ert.* 
from eval_rep_track ert
inner join 
(
        select erp.evaluation_fk, erp.report_type, LTRIM(erp.assign_group_id, '/site/') course_name
        from eval_report_dup@prod erp
        inner join eval_report er
        on er.id = erp.id
        where erp.status='queue'
        and er.status='done'
) cat
on ert.eval_id = cat.evaluation_fk  
and ert.report_type = cat.report_type  
and ert.course_name = cat.course_name;
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果,只是连接条件不同。哪个将运行/执行更快?

eval_id 是NUMBER,report_type 和 course_name 是VARCHAR2。

从使用的开发人员来看,案例 1 具有以下统计信息:[SELECT - 3077 row(s), 0.048 secs] Result set fetched ... 1 statement(s) execution, 3077 row(s)fluence, exec/fetch time: 0.048 /0.236 秒 [1 成功,0 警告,0 错误]

而案例 2:[SELECT - 3077 行,0.019 秒] 结果集提取...执行 1 条语句,3077 行受影响,执行/提取时间:0.019/0.194 秒 [1 成功,0警告,0 错误]

结果表明情况 2 更快。这会在任何平台(ide、开发人员)和数据库中通用吗?这取决于数据类型还是连接总是很昂贵?我实际上并不需要连接的结果。谢谢。

Bar*_*mar 6

我认为带有连接的版本实际上总是会更慢。

如果您单独比较的任何列都有索引,则数据库通常能够使用索引来优化连接。当您比较串联时,它必须执行全表扫描,因为计算结果不会在索引中。

即使列没有被索引,数据库仍然可以更有效地执行比较。它一次比较一对列,一旦其中一个比较失败,就会停止。使用串联时,它必须首先组合两行中的所有列,然后进行字符串比较。

最后,如果任何列是数字,则串联将需要将数字转换为字符串的附加步骤。