我有一个大的查询(不是我写的,但我正在做一些修改)。有一两件事,那种虫子的是,我已经得到了同样的COALESCE函数在大约四个地方。有没有一种办法因素说出来,可能是通过从DUAL一个选择加入?有没有性能优势,以保理它?

下面是查询略微bolwderized:

select 
tbl1.gid
[snip]
         ,COALESCE(t1_end_dt, t6_actl_end_dt,t6_calc_end_dt) perd_end_dt
        ,t1_end_dt
FROM    tbl1
....
JOIN    tbl2               ON (t2_pk          = wpck_wrkr_id  AND
                                            t2_ind_1    ='Y'    AND
        COALESCE(t1_end_dt, t6_actl_end_dt, t6_calc_end_dt) 
        BETWEEN  t2_strt_dt AND t2_end_dt)
JOIN    tbl3                ON (t3_pk               = t2_fk_t3_pk AND
       COALESCE(t1_end_dt, t6_actl_end_dt, t6_calc_end_dt) 
        BETWEEN t3_strt_dt AND t3_end_dt)    
LEFT JOIN tbl4 tbl4_a             ON (tbl4_a.t4_pk         = chkw_wkt_id)
.....
GROUP BY tbl1.gid 
.....
        ,COALESCE(t1_end_dt, t6_actl_end_dt, t6_calc_end_dt)
        ,COALESCE(tbl4_b.t4_or_id, tbl4_a.t4_or_id, t7_or_id )
        ,t1_end_dt
ORDER BY perd_end_dt

请注意,我已经通过命名它在SELECT pred_end_dt,然后参照其由该名称在ORDER BY分解出来的聚结中的一个。

有帮助吗?

解决方案

您应该能够与你的列别名perd_end_dt以替代GROUP发生BY子句。但在发生JOIN条件不能使用列别名。

此确实对性能产生影响。我不认为JOIN 条件可以使用索引,他们目前正在编写方式。然而, 它在JOIN条件只有一个词,所以影响可能是非常 轻微。也就是说,涉及t2_pkt2_ind_1条款可能已经降低行集,因此日期比较只处理一小部分。这取决于我们有多少行谈论和数据是如何分布的。

的一种方法以分解出COALESCE()和利用索引的是创建一个冗余列它是表达的结果。使用触发器来确保它每次插入或更新后的权值。然后索引的列。

但就像我说的,比它的价值可能就比较麻烦了。它会是更多的工作,你应该确信这一变化将使得代码更易于维护,更正确,更迅速。


另一种选择是,以限定的别名COALESCE()表达 在子查询。我不能告诉哪些表列从何而来,因为 你不表别名进行限定。但是,如果我可以假设 他们tbl1的所有列:

...
FROM (
    SELECT COALESCE(t1_end_dt, t6_actl_end_dt, t6_calc_end_dt) perd_end_dt,
      t1_fk_t2_pk
    FROM tbl1) t1
  JOIN tbl2
    ON (tbl2.t2_pk = t1.t1_fk_t2_pk AND tbl2.t2_ind_1 = 'Y'
      AND t1.perd_end_dt BETWEEN tbl2.t2_strt_dt AND tbl2.t2_end_dt)
...

其他提示

您可能板条箱的虚拟表

(Select Coalesce( all your stuff ....) perdEndDt 
   From [all your tables necessary for this one value])

和包括在选择SQL此ASA单独连接表

  Select [all yr other stuff,
      Z.perdEndDt
  From [Other Tables Joined together]
      Join 
         (Select Coalesce( all your stuff ....) perdEndDt,
               [other columns necessary for join conditions]
         From [all your tables necessary for this one value]) As Z
         On [Join conditions for Z to other tables]
  Where  [any filter predicates]
  Order By Z.perdEndDt
     ... etc.  

Oracle是否享有? (它必须做的。)如果你发现自己使用在许多不同的地方在于COALESCE()表达,它可能是值得创建VIEW和使用,而不是原始表(一个或多个)。下面,相同的计算将被执行,但你的查询语法将会更加简洁,因此更清晰。

要我的思维方式,“查看”是在数据库中“表”为“功能”是在程序中“的代码行”。每当使用类似的逻辑找一堆的查询,写因子出公共逻辑和使用一个视图,而不是

也许你可以用从句使用?

with data as
(
   select COALESCE(t1_end_dt, t6_actl_end_dt,t6_calc_end_dt) perd_end_dt
   ,      .....
   ,      ...
   from   tbl1
)
select ...
from   data
,      ....
where  ....
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top