10

単純なことについてはtranslate、CPU の負荷が少ないことを前提に関数を使用する方が良いregexp_replaceですか、それとも道のりですか?

この質問は、Oracle REGEXP_REPLACE 関数内でブラケットをハイフンに置き換えるにはどうすればよいですか?

4

2 に答える 2

3

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 の両方) でより頻繁に正規表現を使用するようになります。

于 2013-04-17T11:01:52.747 に答える