加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle:PL / SQL中最快的方法,以查察是否存在值:List,VARRAY或

发布时间:2021-01-10 12:54:09 所属栏目:站长百科 来源:网络整理
导读:更新假如您想查察长原始题目,请查察编辑内容.这是题目的更简捷的短版本…… 我必要看看GroupA(不老是GroupA,这会改变每个轮回迭代)是否存在于200个阁下的组中的[list,varray,temp table,what].我怎样存储这200个组完全由我节制.但我想将它们存储在一个有助于

更新假如您想查察长原始题目,请查察编辑内容.这是题目的更简捷的短版本……

我必要看看GroupA(不老是GroupA,这会改变每个轮回迭代)是否存在于200个阁下的组中的[list,varray,temp table,what].我怎样存储这200个组完全由我节制.但我想将它们存储在一个有助于最快“存在”搜查的结构中,由于我必需在一个轮回中针对差异的值(不老是GroupA)多次搜查此列表.那么PL / SQL最快,搜查列表……

假如’GroupA’IN(‘GroupA’,’GroupB’)那么……

或行使会员搜查VARRAY …

IF 'GroupA' MEMBER OF myGroups THEN

或以这种方法搜查VARRAY ……

FOR i IN myGroups.FIRST .. myGroups.LAST
LOOP
    IF myGroups(i) = 'GroupA' THEN
        v_found := TRUE;
        EXIT;
    END IF;
END LOOP;

或搜查关联数组……
将在来日诰日举办测试

更新:从每小我私人的提议测试的最终功效
感谢各人.
我运行了这些测试,轮回了1000万次,行使LIKE的逗号脱离字符串好像是最快的以是我想这些点必需转到@Brian McGinity(时刻在下面的评述中).但因为时刻都很是靠近,以是我回收哪种要领也许无关紧急.我想我会行使VARRAY MEMBER OF要领,由于我可以用一行代码加载数组(批量网络),而不必循漫游标来构建一个字符串(感激@Wernfried将MEMBER OF引入我的留意力)…

逗号脱离列表,譬喻:,GroupA,GroupB,GroupC,…约莫200个组…(通过循漫游标建造的列表)

FOR i IN 1 .. 10000000 loop
    if myGroups like '%,NONE,%' then
        z:=z+1;
    end if;
end loop;
--690msec

沟通的逗号脱离列表(循漫游标建造的列表)…

FOR i IN 1 .. 10000000 loop
    if instr(myGroups,',') > 0 then   
        z:=z+1;
    end if;
end loop;
--818msec

varray,沟通的200组(散装网络的varray)……

FOR i IN 1 .. 10000000 loop
    IF 'NONE' MEMBER of myGroups THEN
        z:=z+1;
    end if;
end loop;
--780msec

@Yaroslav Shabalin提议的关联数组要领(通过循漫游标建造的关联数组)…

FOR i IN 1 .. 10000000 loop
    if (a_values('NONE') = 1) then
        z:=z+1;
    end if;
end loop;
--851msec

办理要领

myGroup是varray吗?假如它是一个字符串实行相同于:

select 1
  from dual
 where 'abc,def' like '%,%'

很难遵循你正在行使的束缚……假如也许的话,在sql中做统统,它会更快.

更新:

以是,假如你已经在一个plsql单位中,并但愿保存在一个plsql单位中,那么上面的逻辑将是这样的:

declare
    gp varchar2(200) := 'abc,def,higlmn,op';
  begin
    if ','||gp||',' like '%,%' then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

假如这个自己处于轮回中,那么将列表设为:

declare
    gp varchar2(200)  := 'abc,op';
    gp2 varchar2(200) := ',' || gp || ',';
  begin
    if g2 like '%,%' then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

也实行instr,它也许比以下更快:

declare
    gp varchar2(200) := ',abc,hig,';
  begin
    if instr(gp,') > 0 then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

我不知道这是否比其他提到的办理方案更快(这是一个很好的机遇),这是另一回事.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读