単純なことについてはtranslate
、CPU の負荷が少ないことを前提に関数を使用する方が良いregexp_replace
ですか、それとも道のりですか?
この質問は、Oracle REGEXP_REPLACE 関数内でブラケットをハイフンに置き換えるにはどうすればよいですか?
単純なことについてはtranslate
、CPU の負荷が少ないことを前提に関数を使用する方が良いregexp_replace
ですか、それとも道のりですか?
この質問は、Oracle REGEXP_REPLACE 関数内でブラケットをハイフンに置き換えるにはどうすればよいですか?
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 の両方) でより頻繁に正規表現を使用するようになります。