sourcetip

Oracle에서 regexp_replace vs translate의 성능?

fileupload 2023. 11. 4. 13:15
반응형

Oracle에서 regexp_replace vs translate의 성능?

간단한 것은 사용하는 것이 더 나을까요?translateCPU 집약도가 낮거나 다음과 같은 경우를 전제로 기능합니다.regexp_replace갈 길?

이 질문은 Oracle REGEXP_REFACE 함수 내에서 괄호를 하이픈으로 교체하려면 어떻게 해야 합니까?

단순한 최적화 작업을 진행하고 있다고 생각합니다.정규 표현식은 계산 비용이 너무 많이 들어 결과가 나중에 다시 사용되기를 바라며 캐시됩니다.실제로 서로 다른 문자열을 사용하여 변환을 해보면 전문적인 기능이기 때문에 보통의 번역이 자연스럽게 더 빠르다는 것을 알 수 있을 것입니다.

여기에 제 예시가 있습니다.11.1.0.7.0:

SQL> DECLARE
  2     TYPE t IS TABLE OF VARCHAR2(4000);
  3     l       t;
  4     l_level NUMBER := 1000;
  5     l_time  TIMESTAMP;
  6     l_char  VARCHAR2(4000);
  7  BEGIN
  8     -- init
  9     EXECUTE IMMEDIATE 'ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=2';
 10     SELECT dbms_random.STRING('p', 2000)
 11       BULK COLLECT
 12       INTO l FROM dual
 13     CONNECT BY LEVEL <= l_level;
 14     -- regex
 15     l_time := systimestamp;
 16     FOR i IN 1 .. l.count LOOP
 17        l_char := regexp_replace(l(i), '[]()[]', '-', 1, 0);
 18     END LOOP;
 19     dbms_output.put_line('regex     :' || (systimestamp - l_time));
 20     -- tranlate
 21     l_time := systimestamp;
 22     FOR i IN 1 .. l.count LOOP
 23        l_char := translate(l(i), '()[]', '----');
 24     END LOOP;
 25     dbms_output.put_line('translate :' || (systimestamp - l_time));
 26  END;
 27  /

regex     :+000000000 00:00:00.979305000
translate :+000000000 00:00:00.238773000

PL/SQL procedure successfully completed

위에11.2.0.3.0:

regex     :+000000000 00:00:00.617290000
translate :+000000000 00:00:00.138205000

결론:일반적으로 나는 의심합니다.translate이길 겁니다.

SQL의 경우 다음 스크립트를 사용하여 테스트했습니다.

set timing on

select sum(length(x)) from (
  select translate('(<FIO>)', '()[]', '----') x
  from (
    select *
    from dual
    connect by level <= 2000000
  )
);

select sum(length(x)) from (
  select regexp_replace('[(<FIO>)]', '[\(\)\[]|\]', '-', 1, 0) x
  from (
    select *
    from dual
    connect by level <= 2000000
  )
);

그리고 그들의 성과가translate그리고.regexp_replace거의 항상 똑같았지만 다른 작업의 비용이 테스트하려는 기능의 비용을 압도할 수도 있습니다.

다음으로 PL/SQL 버전을 시도했습니다.

set timing on

declare
  x varchar2(100);
begin
  for i in 1..2500000 loop
    x := translate('(<FIO>)', '()[]', '----');
  end loop;
end;
/

declare
  x varchar2(100);
begin
  for i in 1..2500000 loop
    x := regexp_replace('[(<FIO>)]', '[\(\)\[]|\]', '-', 1, 0);
  end loop;
end;
/

여기에translate버전은 10초도 걸리지 않는 반면,regexp_replace버전은 약 0.2초 -- 약 2배 빠른 속도(!)

이 결과를 바탕으로 SQL과 PL/SQL 모두 성능에 중요한 코드에서 정규 표현을 훨씬 더 자주 사용할 것입니다.

언급URL : https://stackoverflow.com/questions/16058279/performance-of-regexp-replace-vs-translate-in-oracle

반응형