2013-05-17 65 views
1

我正在修改一个现有语句,该语句在一个表中加入用户信息,以便用户信息可以来自另一个表。一个是永久表,另一个是临时表(记录从一个移动到另一个)。我将我的联合更改为左联接,然后离开加入了第二个联系信息表。如果它存在,我需要选择永久字段,如果永久字段不存在,我需要选择临时字段。 154306是我正在选择的主表上所有传入记录的用户标识。这里是我的2个选项选择字段:DB2 Performance CASE vs COALESCE

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 

我想的情况似乎更“正确”的,因为它是实际控制流量,但由于聚结有较少的逻辑遵循它可能会执行得更快。要么完成相同的结果,因为剩下的两个连接可以确保我们能够获取用户的信息,但是不会获得仍然分配给临时用户的订单的永久用户信息。看起来我们有10个字段可以合并/合并,所以我认为性能更好的方法就是要走的路,我认为这是合并的,但我甚至不确定。出于任何原因,哪种方法更好?

+0

当你尝试时发生了什么? –

+0

1次通话的表现并不重要,它是在网站上实时显示负载可以测试的时间。 – MaKR

回答

3

casecoalesce()的性能对连接三个大型表的查询不会产生影响。这种查询主要由读取和匹配表中的行的时间决定。

顺便说一下,这两个不是,正好是一样。如果users.Fname中的值为NULL,那么case逻辑会保留它们,但coalesce()逻辑会填充另一个表中的值。

您的准则应该是表达的清晰。因为你认为case更有意义,所以我建议你去那个。

+0

谢谢,这很有帮助。显然他们错误地告诉我 - 记录不会从温度转移到永久性,它们被复制,而不是一直被复制。我们只是要使用coalesce,以便抓住所有可能的信息。很高兴知道这对未来,虽然:) – MaKR