Oracle PL / SQL скорость вызовов NVL / LENGTH / TRIM по сравнению с NOT NULL AND! = '' - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь найти лучший способ проверить, содержит ли переменная CHAR/VARCHAR2 символы (NULL или пробелы следует считать одинаковыми, как "без значения"):

Я знаю, что естьнесколько решений, но кажется, что (NVL(LENGTH(TRIM(v)),0) > 0) быстрее, чем (v IS NOT NULL AND v != ' ')

Есть идеи, почему? Или я что-то не так сделал в своем тестовом коде?

Протестировано с Oracle 18c в Linux, UTF-8 db charset ...

Я получаю следующие результаты:

time: +000000000 00: 00: 03.582731000

время: +000000000 00: 00: 02.494980000

set serveroutput on;

create or replace procedure test1
is
    ts timestamp(3);
    x integer;
    y integer;
    v char(500);
    --v varchar2(500);
    begin
    ts := systimestamp;
    --v := null;
    v := 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
    for x in 1..50000000
    loop
        if v is not null and v != ' ' then
           y := x;
        end if;
    end loop;
    dbms_output.put_line('time:' || (systimestamp - ts) ) ;
    end;
/

create or replace procedure test2
is
    ts timestamp(3);
    x integer;
    y integer;
    v char(500);
    --v varchar2(500);
    begin
    ts := systimestamp;
    --v := null;
    v := 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
    for x in 1..50000000
    loop
        if nvl(length(trim(v)),0) > 0 then
           y := x;
        end if;
    end loop;
    dbms_output.put_line('time:' || (systimestamp - ts) ) ;
    end;
/

begin
    test1();
    test2();
end;
/

drop procedure test1;
drop procedure test2;

quit;

1 Ответ

2 голосов
/ 08 октября 2019

Лучше всего игнорировать разницу в скорости между небольшими функциями и использовать все, что проще.

В реалистичном программировании базы данных время запуска таких функций, как NVL или IS NOT NULL, совершенно не имеет значения по сравнению свремя, необходимое для чтения данных с диска или время, необходимое для объединения данных. Если одна функция экономит 1 секунду на 50 миллионов строк, никто не заметит. Принимая во внимание, что если оператор SQL считывает 50 миллионов строк с полным сканированием таблицы вместо использования индекса, или наоборот, это может полностью сломать приложение. ,(Но не невозможно - если у вас есть конкретный вариант использования, то, пожалуйста, добавьте его к вопросу.) Если вам действительно нужен оптимальный процедурный код, возможно, вы захотите заняться написанием внешней процедуры на Java или C.

...