оптимизация SQL-запросов - замена NVL - PullRequest
0 голосов
/ 15 октября 2018

Я использую nvl для проверки значения.Если первый оператор возвращает нулевое значение, то второй оператор должен быть выполнен.Но это удваивает время запроса.Есть ли лучший способ сделать это?

nvl(
    (
            select * from (
                    select tad.ASP_NAME  
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
            )
            where ROWNUM = 1
    )
    ,
    (
            select * from (
                    select tad.ASP_NAME 
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
            )
            where ROWNUM = 1
    )
) ASP_NAME
,nvl(
    (
            select * from (
                    select tad.TIERING_2  
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
            )where ROWNUM = 1
    )
    ,
    (
            select * from (
                    select tad.TIERING_2 
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
            ) where ROWNUM = 1
    )
) TIERING_2
,nvl(
    (
            select * from (
                    select tad.TIERING_1 
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
            )where ROWNUM = 1
    )
    ,
    (
            select * from (
                    select tad.TIERING_1 
                    from TBL_ASP_DETAILS tad 
                    where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
            )where ROWNUM = 1
    )
)TIERING_1,

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете упростить свои подзапросы, используя ORDER BY и FETCH.Поэтому я не уверен, поможет ли это времени выполнения, но, поскольку ваше условие не индексируется, это должно уменьшить его:

SELECT * FROM TBL_ASP_DETAILS tad 
 WHERE lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
    OR lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
 ORDER BY CASE WHEN lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%' THEN 0 ELSE 1 END
 FETCH FIRST ROW ONLY
0 голосов
/ 15 октября 2018

У нас есть только фрагмент NVL для продолжения, а не остальные, из ссылки te1.last_name я вижу, что это коррелированный подзапрос, поскольку te1 не входит в приведенный фрагмент кода.

Грубая идея заключается в том, что вам нужно объединить 2 запроса вместо того, чтобы повторять их - в этом случае они объединяются на основе te1.last_name, поскольку это, как вам кажется, нужно, но без остальной части запроса, чтобыпонять контекст, я не могу быть уверен.

После присоединения вы можете просто использовать nvl (или объединить для более ANSI-подхода)

С точки зрения производительности, это всегда будет немного проблематично, так как вы используете полный подстановочный поиск вгде пункты, а также нижняя функция.

select 
    coalesce(x.asp_name, y.asp_name) as asp_name
    , coalesce(x.tiering_2, y.tiering_2) as tiering_2
    , coalesce(x.tiering_1, y.tiering_1) as tiering_1
from (

                select * from (
                        select 
                                te1.last_name, tad.ASP_NAME, tad.TIERING_2,tad.TIERING_1   
                        from TBL_ASP_DETAILS tad 
                        where lower(te1.last_name) like '%'||lower(tad.ASSIGNED_FE_LAST_NAME)||'%'
                )
                where ROWNUM = 1
) x
full join (
                select * from (
                        select te1.last_name, tad.ASP_NAME, tad.TIERING_2,tad.TIERING_1    
                        from TBL_ASP_DETAILS tad 
                        where lower(te1.last_name) like '%'||lower(tad.ASP_NAME)||'%'
                )
                where ROWNUM = 1
) y on x.last_name = y.last_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...