为了简单translate起见,最好在不占用大量CPU的前提下使用该功能,或者regexp_replace该走的路要走吗?
translate
regexp_replace
我认为您正在进行简单的优化。regexp表达式的计算是如此昂贵,以至于结果被缓存起来,希望将来可以再次使用。如果您实际使用不同的字符串进行转换,您会发现适度的翻译自然是更快的,因为它是其专门功能。
这是我的示例,在上运行11.1.0.7.0:
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:
11.2.0.3.0
regex :+000000000 00:00:00.617290000 translate :+000000000 00:00:00.138205000
结论:总的来说,我怀疑translate会赢。