dan ileri geliyor, ben şu komut dosyası ile bu test:
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
)
);
ve translate
ve regexp_replace
performansı hemen hemen her zaman aynı olduğunu gördük, ama olabilir Diğer operasyonların maliyeti test etmeye çalıştığım fonksiyonların maliyetini ezmek olabilir. etrafında 0,2 saniye süre regexp_replace
versiyonu Burada
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
sürümü sadece 10 saniyenin altında sürer - hızlı büyüklük yaklaşık 2 siparişler
:
Sonraki, bir PL/SQL versiyonunu denedik (!)
Bu sonuca dayanarak, performans kritik kodumda daha sık düzenli ifadeler kullanacağım - SQL ve PL/SQL.
Burada biraz aceleyle atlattığınızı düşünüyorum. :) Bunu düşünürseniz, yalnızca önbellek optimizasyonu çalışma zamanındaki bu büyüklük farkını açıklayabilir. Gerçek bir dünya örneğinde, aynı dizgeyi şüphelendiğim yere çeviremezsiniz. –
Yine de bazı durumlarda 'regexp' **' translate'den daha hızlı ** olduğunu görmek ilginçtir :) –
10g üzerinde REGEXP_'in REGEXP olmayan analoglarından daha yavaş bir ya da iki derece güvenilir olduğunu buluyorum. Farkı ölçmek için bir şeyler yapmak yeterlidir). Ancak, 10g yerleşik regex işlevleri ile ilk sürümüdür ve Oracle'ın 11g için bazı önemli ayarlamalar yapmasını beklerdim. – APC