当前位置: 首页 > 面试题库 >

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

杜嘉木
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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



 类似资料:
  • 我用这个最小的可复制的例子来说明我的问题。我已经设法解决了这个问题,但我确信还有更优雅的编码方式。 这个问题是关于基于多个标准的二元分类。为了满足要求,一个甜甜圈(编码1)需要至少3(或更多)的分数:“a”标准项中的至少一个、“B”标准项中的至少两个和“C”标准项中的至少三个。如果不满足这些要求,将不奖励甜甜圈(编码0)。

  • 日安。 因此,我有mapping@id@generatedvalue(strategy=generationtype.sequence,generator=“discount_fares_id_sequence”)@sequenceGenerator(name=“discount_fares_id_sequence”,sequenceName=“discount_fares_id_seq”,all

  • 问题内容: 我已经尝试解决这个问题一段时间了,希望有人能帮助我。我有两个桌子,第一个桌子是 表名:OnlineTest 第二张表是 表名称:UserStatus 结果 我已经试过这个查询, 但是此查询将带出结果的前两行,而不是最后两行,其中userId和status为null。 如何带来以上结果? 问题答案: 将谓词放在子句中: 这将返回的所有行,其中谓词失败的列填充为。

  • 我有3个CSV文件。每个数据框都有第一列作为人的(字符串)名称,而每个数据框中的所有其他列都是该人的属性。 如何将所有三个CSV文档“连接”在一起,创建一个单个CSV,每行都具有该人字符串名称的每个唯一值的所有属性? Pandas中的函数指定我需要一个多索引,但是我对分层索引方案与基于单个索引进行连接有什么关系感到困惑。

  • 我有两个熊猫dfx和y,它们都有相同的3列abc(不可为null)。我需要创建一个新的df z,通过“从x减去与y的行完全相同的行”获得,即a 我该怎么做呢?陷入了索引,协调,合并,加入,... 例子:

  • 我正在使用Ingres 11.0 DB,不确定它是否在其他数据库引擎上具有相同的行为,但这里是它 它不会返回表1中的所有记录,但我使用的是左连接,它应该从T1返回aa记录,从t2只处理行,只返回1条记录 如果我将其中一个条件从where子句移动到join条件,它的开始将返回我所期望的结果 问题是为什么它不工作在哪里所有搜索条件在哪里子句,但工作时,我移动t2.id_number从哪里加入条件? 我