UPDATE如果您想查看很长的原始问题,请查看编辑。这是问题的更清晰的简短版本......
我需要看看是否GroupA
(不总是GroupA
,这会改变每个循环迭代)存在于大约 200 个组的 [列表、数组、临时表,等等] 中。如何存储这 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带来MEMBER OF
引起我的注意)...
逗号分隔列表,例如:,GroupA,GroupB,GroupS,...大约 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