оптимизация выбрать отдельный запрос - PullRequest
0 голосов
/ 30 сентября 2019

Как я могу оптимизировать этот запрос, как переписать запрос через существует:

select DISTINCT 
        p.SBJ_ID, 
    nvl(l.ATTR,c.CODE) as ATTR, 
        l.VALUE
from T_TRFPRMLST p,
       T_CMSATTR_LINK l, 
       C_SBJCONCEPT c
where l.SBJ_ID(+) = p.SBJ_ID
  and p.sbj_id = c.ID;

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Пожалуйста, прежде всего используйте синтаксис в стиле ANSI.

Теперь, насколько мне известно, NVL работает хуже при работе с большими наборами данных.

Так как же мы можем достичь той же функциональности? - Мы можем использовать DECODE или CASE WHEN.

Среди этих двух также CASE WHEN будет лучше, когда речь заходит о производительности.

Сравните план выполнения запроса, упомянутый вваш вопрос и план выполнения следующего запроса, и вы обязательно найдете разницу.

SELECT DISTINCT
    P.SBJ_ID,
    CASE
        WHEN L.ATTR IS NOT NULL THEN L.ATTR
        ELSE C.CODE
    END AS ATTR,
    L.VALUE
FROM
    T_TRFPRMLST P
    JOIN C_SBJCONCEPT C ON ( P.SBJ_ID = C.ID )
    LEFT JOIN T_CMSATTR_LINK L ON ( P.SBJ_ID = L.SBJ_ID);

Пожалуйста, убедитесь, что PKs и FKs созданы правильно и правильные indexes также доступны какindexes созданы в основном для исполнения.

Ура !!

0 голосов
/ 30 сентября 2019

Вы не можете использовать exists здесь, потому что вы используете более 1 столбца таблицы в select. И я понимаю, что вы должны использовать стандартное ключевое слово join при объединении таблиц.

select DISTINCT 
        p.SBJ_ID, 
    nvl(l.ATTR,c.CODE) as ATTR, 
        l.VALUE
from T_TRFPRMLST p
join T_CMSATTR_LINK l
  on l.SBJ_ID = p.SBJ_ID 
join C_SBJCONCEPT c
  on p.sbj_id = c.ID;

Я могу ошибаться влево / вправо, так как я не очень часто с (+).

Надеюсьэто помогает.

...