我有一个用PL / SQL(Oracle 11.2g)开发的外部API,我在模块SQL语句中使用它。这是一个非常简单的例子:
select *
from (select column_value c from table(api_pkg.function(param1, param2))) t1
join table2 t2
on t2.pkc = t1.c
...
其中table2.pkc是此类表的PK。问题是查询性能非常低,因为优化器不使用table2索引。
如果我创建一个表
create table tmp_result as
select column_value c from table(api_pkg.function(param1, param2))
我在第一个查询中使用它,优化器使用table2索引
select *
from tmp_result t1
join table2 t2
on t2.pkc = t1.c
表现很棒。可以合理地认为,由于Oracle不知道函数返回的行数,因此无法正确优化查询。
原始查询加入了23个表,我很少有其他人使用这种方法和良好的执行计划,所以我不愿意添加提示来强制执行正确的执行计划。相反,我可以强制优化器首先找出函数返回的行数,然后生成计划吗?或者当然,还有其他方法吗?
到目前为止,我尝试http://www.dba-oracle.com/t_materialize_sql_hint.htm但没有成功,也无法使用提示强制使用特定索引。
答案 0 :(得分:0)
也许尝试将此子查询移动到with
子句。这可能有所帮助。
如果您不想要ORDERED
或INDEX
这样的提示,除非您先将结果插入临时表,否则可能很难强制优化器对其进行计数。