小编典典

在多列上的连接条件与在串联列上的单连接?

sql

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

情况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;

或者

情况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;

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

eval_id为NUMBER,report_type和course_name为VARCHAR2

对于所使用的开发人员,情况1具有以下统计信息:[SELECT-3077行,0.048秒]提取了结果集…执行了1条语句,影响了3077行,执行/获取时间:0.048
/0.236秒[1成功,0警告,0错误]

而情况2:[SELECT-3077行,0.019秒]已提取结果集…已执行1条语句,影响3077行,执行/获取时间:0.019 /
0.194秒[1成功,0警告,0个错误]

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


阅读 160

收藏
2021-05-23

共1个答案

小编典典

我认为带有串联的版本实际上总是比较慢。

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

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

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

2021-05-23