sql – 在Oracle中regexp_replace vs translate的性能?

前端之家收集整理的这篇文章主要介绍了sql – 在Oracle中regexp_replace vs translate的性能?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于简单的事情,最好使用translate函数,前提是它的cpu密集度较低,或者是 regexp_replace的方法吗?

这个问题来自How can I replace brackets to hyphens within Oracle REGEXP_REPLACE function?

解决方法

我认为你正在进行简单的优化. regexp表达式计算起来非常昂贵,结果被缓存,希望将来可以再次使用它.如果您实际使用不同的字符串进行转换,您会看到适度的转换自然更快,因为它是它的专用函数.

这是我的例子,在11.1.0.7.0上运行:

  1. sql> DECLARE
  2. 2 TYPE t IS TABLE OF VARCHAR2(4000);
  3. 3 l t;
  4. 4 l_level NUMBER := 1000;
  5. 5 l_time TIMESTAMP;
  6. 6 l_char VARCHAR2(4000);
  7. 7 BEGIN
  8. 8 -- init
  9. 9 EXECUTE IMMEDIATE 'ALTER SESSION SET PLsql_OPTIMIZE_LEVEL=2';
  10. 10 SELECT dbms_random.STRING('p',2000)
  11. 11 BULK COLLECT
  12. 12 INTO l FROM dual
  13. 13 CONNECT BY LEVEL <= l_level;
  14. 14 -- regex
  15. 15 l_time := systimestamp;
  16. 16 FOR i IN 1 .. l.count LOOP
  17. 17 l_char := regexp_replace(l(i),'[]()[]','-',1,0);
  18. 18 END LOOP;
  19. 19 dbms_output.put_line('regex :' || (systimestamp - l_time));
  20. 20 -- tranlate
  21. 21 l_time := systimestamp;
  22. 22 FOR i IN 1 .. l.count LOOP
  23. 23 l_char := translate(l(i),'()[]','----');
  24. 24 END LOOP;
  25. 25 dbms_output.put_line('translate :' || (systimestamp - l_time));
  26. 26 END;
  27. 27 /
  28.  
  29. regex :+000000000 00:00:00.979305000
  30. translate :+000000000 00:00:00.238773000
  31.  
  32. PL/sql procedure successfully completed

在11.2.0.3.0:

  1. regex :+000000000 00:00:00.617290000
  2. translate :+000000000 00:00:00.138205000

结论:总的来说,我怀疑翻译会赢.

猜你在找的MsSQL相关文章