Per SQL, ho provato questo con il seguente script:
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
)
);
e ha scoperto che le prestazioni di translate
e regexp_replace
erano quasi sempre gli stessi, ma potrebbe che il costo delle altre operazioni stia schiacciando il costo delle funzioni che sto provando a testare.
Poi, ho provato una versione 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;
/
Ecco la versione translate
prende poco meno di 10 secondi, mentre la versione regexp_replace
circa 0,2 secondi - circa 2 ordini di grandezza più veloci
(!)
Sulla base di questo risultato, userò le espressioni regolari molto più spesso nel mio codice critico delle prestazioni - sia SQL che PL/SQL.
fonte
2013-04-17 11:01:52
Penso che tu stia saltando a una conclusione un po 'frettolosamente qui :) Se ci pensi, solo l'ottimizzazione della cache può spiegare questa grandezza della differenza in runtime. In un mondo reale, non si può convertire la stessa stringa più e più volte sospetto. –
Tuttavia, è interessante vedere che in alcuni casi 'regexp' ** è più veloce ** di' translate' :) –
Su 10g Trovo che REGEXP_ sia attendibilmente uno o due ordini di grandezza più lento dei loro analoghi non-REGEXP (quando facendo abbastanza di qualcosa per misurare la differenza). Tuttavia, 10g è stata la prima versione con funzioni regex incorporate e mi sarei aspettato che Oracle avesse apportato alcune modifiche significative per 11g. – APC