Oracle优化器使用sql语句中的函数

时间:2017-07-11 13:04:42

标签: plsql oracle11g query-optimization

我有一个用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但没有成功,也无法使用提示强制使用特定索引。

1 个答案:

答案 0 :(得分:0)

也许尝试将此子查询移动到with子句。这可能有所帮助。

如果您不想要ORDEREDINDEX这样的提示,除非您先将结果插入临时表,否则可能很难强制优化器对其进行计数。