Oracle에서 regexp_replace vs translate의 성능?
간단한 것은 사용하는 것이 더 나을까요?translate
CPU 집약도가 낮거나 다음과 같은 경우를 전제로 기능합니다.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
'sourcetip' 카테고리의 다른 글
jQuery 플러그인을 확장하는 가장 좋은 방법 (0) | 2023.11.04 |
---|---|
XML에서 "xmlns"는 무엇을 의미합니까? (0) | 2023.11.04 |
업로드하기 전에 HTML5를 사용하여 이미지 크기 조정 (0) | 2023.11.04 |
Angular에서 "track by"란 무엇입니까?JS는 어떻게 작동합니까? (0) | 2023.11.04 |
JQuery select2 set default value in list의 옵션에서 기본값을 설정하시겠습니까? (0) | 2023.11.04 |