我试图在Oracle PL / SQL(10g)中优化大查询(没有子查询但是大表大小)。首先,我从连接中删除了几个表,并缓存了它们在集合中返回的数据(嵌套表是特定的),这导致了两个选择
示例: (比如变量名称是缓存),原始查询中的条件是
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\BusinessRules\3.0\
选项1
where a.col_in_a = b.col_in_b;
so I changed it to,
select b.col_in_b bulk collect into cache from b where -- some conditions;
选项2
where a.col_in_a member of cache;
问题1:上述哪一项更好。
更进一步,我还可以选择不使用集合,只需使用with子句和materialize提示
where a.col_in_b in (select column_value from table(cache));
问题2使用集合或with子句缓存
一旦我做出这个决定,我想让这个新的查询有点灵活,即让它变得动态,几个表和条件在这里和那里稍微改变。这让我有两个选择 1.执行即时查询'大选择查询' 2. OPEN-WITH-FOR'大选择查询'
因为我将这个大查询的结果存储在引用游标中,我相信OPEN-WITH-FOR是可行的方法。这导致我以两种方式编写动态查询
问题3:如何按照问题1中提到的方式制作类似下面的内容,哪个最好?
使用dummyCache with cache as (SELECT /*+ materialize */
col_in_b from b where -- some condtions
)
select col_in_a from a,b where a.col_in_b = cache.col_in_b;
其中,dummyCache可以是逗号分隔的字符串列表,或者我可以使用绑定变量传递嵌套表并使用子句成员。我不知道如何使其工作..
我希望我已经尝试过清楚解释。要求所有人建议我一些更好的方式..