Объединить декартово соединение с высокой стоимостью - PullRequest
0 голосов
/ 25 февраля 2019

Слияние Cartesian Join с высокой стоимостью.

Мы запрашивали БД для заполнения некоторых зарегистрированных заявок, однако сформированный запрос вызвал вышеуказанную проблему и был передан нашей командой по производительности.

Здесь я занимаюсь программированием на Java и не очень разбираюсь в этих соединениях.Может ли кто-нибудь помочь мне с тем, как можно перекадрировать приведенный ниже фрагмент запроса, чтобы избежать слияния декартового объединения с высокой стоимостью.

FROM
    SERVICE_REQ SR,
    SR_COBRAND_DATA SR_COB_DATA,
    REPOSITORY rep,
    SR_ASSIGNEE_INFO ASSIGNEE_INFO 
WHERE
    SR.SR_COBRAND_ID=rep.COBRAND_ID 
    AND SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID (+) 
    AND SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID (+) 
    AND SR.SR_COBRAND_ID = 99  

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Создать составной индекс по столбцам SR_COBRAND_ID и SERVICE_REQ_ID таблицы SERVICE_REQ

- Создать индекс [indexname] для SERVICE_REQ (SR_COBRAND_ID, SERVICE_REQ_ID);

0 голосов
/ 25 февраля 2019

Просто предложение

вы не должны использовать старый неявный синтаксис объединения, а объединить синтаксис объединения синтаксис

SELECT * 
FROM  SERVICE_REQ SR 
LEFT JOIN  SR_COBRAND_DATA SR_COB_DATA ON SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID
INNER JOIN REPOSITORY rep  ON SR.SR_COBRAND_ID=rep.COBRAND_ID 
LEFT JOIN SR_ASSIGNEE_INFO ASSIGNEE_INFO  ON SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID
WHERE SR.SR_COBRAND_ID = 99  

В любом случае, исходя из этого условия, между таблицей есть не декартово произведение, аСоединение влево для SERVICE_REQ с SR_COBRAND_DATA и уменьшением SR_ASSIGNEE_INFO за счет внутреннего соединения с REPOSITORY

может заключаться в том, что для объяснения вашей цели вы должны добавить правильную выборку данных ожидаемый результат и ваш фактический результат

...