我正在创建一个包含两个非常大的数据集的视图,这些数据集编号了数百万行。我已经使用完整的外部联接将两个表联接在一起,并按某些列进行分组。
我有两个表共有的字段ID列,我需要用户能够对其进行过滤。最初,我在外部联接语法中使用TableA.F_ID = TableB.F_ID,并且效果非常好。但是,如果TableB中有F_ID行,而TableA中没有,则除非我使用
where TableA.F_ID = <VALUE> or TableB.ID = <VALUE>
为了避免必须使用or子句,我使用了F_ID来自查询的寓言,它通过内部联接来过滤数据。此方法确实有效,但是必须在过滤出行之前对TABLEA和TABLEB执行select,并且查询要花10分钟以上的时间才能返回。
根据下面的查询,有没有一种方法可以对此进行优化,以获得更快的最终结果?
select fm.F_ID
,fad.A
,fad.B
,fad.C
,fac.A
,fac.B
,fac.C
,fab.SUM as FAB_SUM
,fac.SUM as FAC_SUM
from V_FAB_COMBINED_GROUPS fad
FULL OUTER JOIN V_LTB_ALL_GROUPED fac on
fab.F_ID = fac.F_ID
and fac.A = fab.A
and fac.B = fab.B
and fac.C = fab.C
inner join fm on (fm.F_ID = fab.F_ID or fm.F_ID = fac.F_ID)
where fm.F_ID = 1
答案 0 :(得分:0)
尝试一下,看看它是否可以改善性能:
select cte.*
from (select fm.F_ID fm_id
,fac.F_ID fac_id
,fad.A
,fad.B
,fad.C
,fac.A
,fac.B
,fac.C
,fab.SUM as FAB_SUM
,fac.SUM as FAC_SUM
from V_FAB_COMBINED_GROUPS fab
FULL OUTER JOIN V_LTB_ALL_GROUPED fac
on fab.F_ID = fac.F_ID
and fac.A = fab.A
and fac.B = fab.B
and fac.C = fab.C) cte
join fm on (fm.F_ID = cte.fm_id or fm.F_ID = cte.fac_id)
where fm.F_ID = 1