更新如果您想看较长的原始问题,请查看编辑内容。这是问题的更简短的版本。
我需要查看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;
我不知道这是否比提到的其他解决方案要快(这是一个很好的机会),这是其他尝试。