我观察到有两种方法可以在多个表上实现目标。结果集中的一列将被更新,并且可能需要速度。结果集可以通过以下方式获得:
情况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。
NUMBER
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更快。这会在任何平台(例如开发人员)和数据库中通用吗?这是依赖于数据类型还是串联总是很昂贵?我实际上不需要连接的结果。谢谢。
我认为带有串联的版本实际上总是比较慢。
如果您要比较的任何列中的任何一个都有索引,则数据库通常将能够使用索引来优化联接。比较串联时,它必须执行全表扫描,因为计算结果不会出现在索引中。
即使没有为列建立索引,数据库仍可以更有效地执行比较。它一次比较一对列,并且一旦其中一个比较失败就可以停止。使用串联时,它必须首先合并两行中的所有列,然后进行字符串比较。
最后,如果任何列为数字,则串联将需要将数字转换为字符串的附加步骤。