nvl('x',user)
Думаете маленькая стоимость? А если вы выполняете его все время.
Что если мы напишем это так:
coalesce('x',user)Нет разницы?
Протестируем это с опцией tracing:
TRACING SAGE@sw10g> begin 2 for i in 1..power(2,17) loop 3 if nvl('x',user) = 'x' then 4 null; 5 end if; 6 end loop; 7 end; 8 / PL/SQL procedure successfully completed. Elapsed: 00:00:08.42Без опции tracing этот скрипт будет выполнятся порядка 4 секунд.
А теперь выполним для варианта с COALESCE:
TRACING SAGE@sw10g> begin 2 for i in 1..power(2,17) loop 3 if coalesce('x',user) = 'x' then 4 null; 5 end if; 6 end loop; 7 end; 8 / PL/SQL procedure successfully completed. Elapsed: 00:00:00.01Почему такая разница?
Обратимся к tkprof:
SELECT USER FROM SYS.DUAL call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 0 0.00 0.00 0 0 0 0 Execute 131072 2.21 1.04 0 0 0 0 Fetch 131072 2.81 0.53 0 0 0 131072 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 262144 5.03 1.58 0 0 0 131072Все обращения к USER в вашем PL/SQL или Forms коде вызывают выборку из таблицы DUAL.
Иногда нам нужно обращать внимание на мелочи, и рассмотривать использование COALESCE вместо NVL.
Источник.
Комментариев нет:
Отправить комментарий