Outer JOIN 2 Таблицы, использующие третью таблицу для фильтрации - PullRequest
0 голосов
/ 02 ноября 2018

Я создаю представление с двумя очень большими наборами данных, насчитывающими миллионы строк. У меня есть объединение двух таблиц с использованием полного внешнего объединения и группировки по некоторым столбцам.

У меня есть столбец идентификатора поля, общий для обеих таблиц, и мне нужно, чтобы пользователи могли фильтровать представление. Первоначально я использовал TableA.F_ID = TableB.F_ID в синтаксисе внешнего соединения, и это работало очень хорошо. Однако если бы в TableB были строки F_ID, которых не было в TableA, они бы не отображались, если бы я не использовал

where TableA.F_ID = <VALUE> or TableB.ID = <VALUE>

Чтобы обойти необходимость использования условия or, я использовал басню, из которой F_ID приходит в запросе через внутреннее соединение, для фильтрации данных. Этот метод работает, но он должен выполнить select для TABLEA и TABLEB, прежде чем отфильтровать строки, и запрос занимает более 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 

1 Ответ

0 голосов
/ 02 ноября 2018

Попробуйте и посмотрите, не улучшит ли это производительность:

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 
...