【问题标题】:Splitting string in oracle - fastest way在 oracle 中拆分字符串 - 最快的方式
【发布时间】:2014-10-15 14:42:26
【问题描述】:

有谁知道如何分割用';'分隔的字符串在触发器中,比这段代码更快:

SELECT regexp_substr('asd;asaaaad;dd;', '([^;]*)(;)', 1, level, null, 1) 
  BULK COLLECT INTO array_TREATMENT_TR_CD 
FROM DUAL 
CONNECT BY LEVEL < REGEXP_COUNT('asd;asaaaad;dd;', '[;]') + 1 ;

【问题讨论】:

  • 对我来说似乎是一个很好的解决方案。对我来说,它在不到 1 毫秒的时间内返回。您能否详细解释一下您的情况,为什么速度不够快?这可能会增加答案的有用性:-)
  • 它是针对实时环境的,它的问题是“它会更快吗?”比“还不够快”:)

标签: sql oracle plsql triggers split


【解决方案1】:

Regexp 函数通常比标准 db 函数慢得多。当我运行您的代码 100.000 次时,大约需要 12 秒(在我的数据库上,YMMV)。

然后我创建了这个小测试:

declare
  type t_vc2 is table of varchar2(250) index by pls_integer;

  procedure split_str(
    p_str1      in out nocopy varchar2
  , p_str2      out           varchar2
  , p_separator in            varchar2 default ';'
  )
  is
    l_pos pls_integer;
  begin
    l_pos := instr(p_str1, p_separator);
    if nvl(l_pos, 0) = 0
    then
      p_str2 := p_str1;
      p_str1 := null;
    else
      p_str2 := substr(p_str1, 1, l_pos-1);
      p_str1 := substr(p_str1, l_pos+1);
    end if;
  end split_str;
begin
  for l_i in 1 .. 1000000
  loop
    declare
      array_TREATMENT_TR_CD    t_vc2;
      l_input varchar2(250);
      l_return varchar2(250);
    begin
      l_input := 'asd;asaaaad;dd;';
      loop
        split_str(l_input, l_return);
        if l_return is not null
        then
          array_TREATMENT_TR_CD(array_TREATMENT_TR_CD.count+1) := l_return;
        end if;
        exit when l_return is null;
      end loop;
    end;
  end loop;
end;
/

这会将您的示例字符串 100.000 次解析为具有标准 db 函数的数组。大约需要 0.5 秒。如果您的目标是“实时”,那将是一项重大改进。

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多