DB2 性能案例与 COALESCE

Posted

技术标签:

【中文标题】DB2 性能案例与 COALESCE【英文标题】:DB2 Performance CASE vs COALESCE 【发布时间】:2013-05-17 16:16:06 【问题描述】:

我正在修改将用户信息连接到一个表中的现有语句,以便用户信息可以来自另一个表。一个是永久表,另一个是临时表(记录从一个表移动到另一个表)。我将我的加入更改为左加入,然后左加入第二个联系信息表。如果永久字段存在,我需要选择永久字段,如果永久字段不存在,我需要选择临时字段。 154306 是我从中选择的主表上所有传入记录的用户 ID。以下是我选择字段的 2 个选项:

SELECT

CASE WHEN U.USRID = 154306
    THEN T.TMPFNAME
    ELSE U.FNAME
END AS FNAME,

COALESCE (U.LNAME, T.TMPLNAME) AS LNAME

FROM FILES.ORDERS O
LEFT JOIN FILES.USERS U ON U.USRID <> 154306 AND U.USRID = O.ORDUSR
LEFT JOIN FILES.TMPUSERS T ON O.ORDNUM = T.TMPORD

我认为这个案例似乎更“正确”,因为它实际上是在控制流程,但由于合并的逻辑较少,它可能会执行得更快。两者都应该完成相同的结果,因为 2 个左连接确保我们无论如何都能获得用户的信息,但不会获得仍分配给临时用户的订单的永久用户信息。看起来我们有 10 个字段要案例/合并,所以我认为性能更好的方法是要走的路,我认为这是合并,但我什至不确定。无论出于何种原因,哪种方式更好?

【问题讨论】:

你尝试的时候发生了什么? 1 次调用的性能是微不足道的,只有在网站上线时才能测试负载。 【参考方案1】:

casecoalesce() 的性能对连接三个大表的查询没有影响。此类查询主要取决于读取和匹配表中的行的时间。

顺便说一句,两者完全不一样。如果您在 users.Fname 中有 NULL 值,则 case 逻辑将保留它们,但 coalesce() 逻辑将填充另一个表中的值。

您的标准应该是表达清晰。因为您认为case 更有意义,所以我建议您使用它。

【讨论】:

谢谢,这很有帮助。显然他们误导了我 - 记录没有从临时移动到永久,它们被复制,而不是总是被复制。我们将使用 coalesce 来获取所有可能的信息。不过很高兴知道这一点:)

以上是关于DB2 性能案例与 COALESCE的主要内容,如果未能解决你的问题,请参考以下文章

《循序渐进DB2.DBA系统管理运维与应用案例》(牛新庄著)读书笔记3 影响DB2环境的变量

《循序渐进DB2.DBA系统管理运维与应用案例》(牛新庄著)读书笔记5 DB2多副本安装

《循序渐进DB2.DBA系统管理运维与应用案例》(牛新庄著)读书笔记1

《循序渐进DB2--D B2系统管理运维与应用案例》读书随笔一

《循序渐进DB2.DBA系统管理运维与应用案例》(牛新庄著)读书笔记2

用于更新表但多列的 DB2 案例语句