четверг, 18 марта 2010 г.

Ещё раз COALESCE против NVL

Как часто вы видите запись, вроде этой:
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.

Источник.

Комментариев нет:

Отправить комментарий