Sql 子句/With子句的成员或在子句/With子句中vs集合/集合是否具有绑定变量

Sql 子句/With子句的成员或在子句/With子句中vs集合/集合是否具有绑定变量,sql,oracle,performance,oracle10g,Sql,Oracle,Performance,Oracle10g,我正在尝试优化OraclePL/SQL(10g)中的一个大查询(,没有子查询,但有巨大的表大小)。首先,我从连接中删除了几个表,并缓存了它们在集合中返回的数据(具体来说是嵌套表),这导致了两种选择 示例: (假设变量名为cache)并且原始查询中的条件为 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 conditi

我正在尝试优化OraclePL/SQL(10g)中的一个大查询(,没有子查询,但有巨大的表大小)。首先,我从连接中删除了几个表,并缓存了它们在集合中返回的数据(具体来说是嵌套表),这导致了两种选择

示例: (假设变量名为cache)并且原始查询中的条件为

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;
选择1

where a.col_in_a member of cache;
选择2

where a.col_in_b in (select column_value from table(cache));
问题1:以上两个中哪一个更好。

更进一步说,我还可以选择不使用集合,只使用带有materialize提示的with子句

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;
问题2使用集合或with子句进行缓存

一旦我做出这个决定,我想让这个新查询变得更灵活一些,也就是说,让它变得动态,很少有表和条件在这里或那里发生变化。这就引出了另外两种选择 1.立即执行“大选择查询” 2.“大选择查询”的开放式

因为我将这个大查询的结果存储在一个ref游标中,所以我相信OPEN-WITH-FOR是一个不错的选择。这使我以两种方式编写动态查询

问题3:如何使以下内容以问题1中所述的方式工作,哪种方式最好?
使用dummyCache打开光标“从a、b中选择a中的列,其中a.col\u in\u b in:cache”
其中dummyCache可以是逗号分隔的字符串列表,也可以使用bind变量传递嵌套表并使用子句的成员。。我不知道该怎么做


我希望我已经解释清楚了。请所有人也向我推荐一些更好的方法。

您是否对两种收集方法和CTE(with子句)方法进行了基准测试,有无materialize提示?与原始查询一致?看起来你真的可以自己回答1和2。我希望CTE的表现会比这个系列好;这两种方法是否比原始方法更好取决于查询的其余部分在做什么,尽管看起来您试图比优化器更聪明。但是为什么不检查呢?具体化提示没有文档记录,所以我会小心在生产代码中使用它。另外,我曾经因为它有一个ora-600,所以我对它更加谨慎!我会跳过这个暗示,让甲骨文决定是否值得实现它;例如,如果子查询在整个查询中的多个位置使用,那么它很可能被具体化。还有,为什么是嵌套表而不是全局临时表(GTT)?嘿,Alex,有了CTE,查询的成本就更高了。所以我对这种行为感到困惑。你能建议我如何在这些不同的场景中对性能进行基准测试和验证吗。此外,我缓存在嵌套表中的数据仅用于此select查询。事实上,整个查询位于一个只有select语句的函数中。GTT在这种情况下有意义吗?您是否对两种收集方法和CTE(with子句)方法进行了基准测试,有无materialize提示?与原始查询一致?看起来你真的可以自己回答1和2。我希望CTE的表现会比这个系列好;这两种方法是否比原始方法更好取决于查询的其余部分在做什么,尽管看起来您试图比优化器更聪明。但是为什么不检查呢?具体化提示没有文档记录,所以我会小心在生产代码中使用它。另外,我曾经因为它有一个ora-600,所以我对它更加谨慎!我会跳过这个暗示,让甲骨文决定是否值得实现它;例如,如果子查询在整个查询中的多个位置使用,那么它很可能被具体化。还有,为什么是嵌套表而不是全局临时表(GTT)?嘿,Alex,有了CTE,查询的成本就更高了。所以我对这种行为感到困惑。你能建议我如何在这些不同的场景中对性能进行基准测试和验证吗。此外,我缓存在嵌套表中的数据仅用于此select查询。事实上,整个查询位于一个只有select语句的函数中。GTT在这种情况下有意义吗?