更新如果您想看较长的原始问题,请查看编辑内容。这是问题的更简短的版本。

我需要查看GroupA(并非总是GroupA,它会更改每个循环迭代)是否存在于200个左右的[列表,varray,临时表,无论如何]中。我如何存储这200个组完全由我控制。但是我想将它们存储在一个结构中,以使其能够最快速地进行“存在”检查,因为我必须在循环中针对不同的值(并非总是GroupA)检查该列表很多次。在PL / SQL中最快的是什么,检查列表...
IF 'GroupA' IN ('GroupA','GroupB') THEN...
或使用MEMBER OF ...检查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;

或检查关联数组...will test this tomorrow
更新:根据所有人的建议进行测试的最终结果
谢谢大家
我运行了这些测试,循环了1000万次,使用LIKE逗号分隔的字符串似乎是最快的,所以我猜想这些点必须发送到@Brian McGinity(时间在下面的评论中)。但是,由于时代如此紧迫,所以我选择哪种方法都可能无关紧要。我想我会使用VARRAY MEMBER OF方法,因为我可以用单行代码(批量收集)加载数组,而不必循环游标来构建字符串(感谢@Wernfried引起了我的注意)。 。

逗号分隔的列表,例如:,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, ',NONE,') > 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,NONE,def' like '%,NONE,%'

很难遵循您正在使用的约束条件...如果有可能,请在sql内部执行所有操作,这样会更快。

更新:

因此,如果您已经在plsql单元中并希望留在plsql单元中,则上面的逻辑将如下所示:
declare
    gp varchar2(200) := 'abc,def,NONE,higlmn,op';
  begin
    if ','||gp||',' like '%,NONE,%' then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

如果它本身处于循环中,则按如下方式列出一次:
declare
    gp varchar2(200)  := 'abc,def,NONE,higlmn,op';
    gp2 varchar2(200) := ',' || gp || ',';
  begin
    if g2 like '%,NONE,%' then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

还可以尝试使用instr,它可能比以下方法快:
  declare
    gp varchar2(200) := ',abc,def,NONE,hig,';
  begin
    if instr(gp, ',NONE,') > 0 then
      dbms_output.put_line('y');
    else
      dbms_output.put_line('n');
    end if;
  end;

我不知道这是否比提到的其他解决方案要快(这是一个很好的机会),这是其他尝试。

09-11 19:59