Oracle在sql查询中没有函数调用的索引

时间:2017-04-20 05:57:31

标签: oracle performance query-optimization

我有一个名为t的表(abc varchar2(50),xyz varchar2(50),.. etc),并且在列abc上启用了索引。 Oracle使用userfunction(a)的索引需要很长时间。这是一个动态查询形成可以有另一个条件,必须使用abc上的索引,所以我不想使用no_index提示。

select *from t 
where
userfunction(a) = 0
and exists (select 1 from tab where t.abc='' ...etc)
and ..etc

我尝试通过将函数移动到嵌套查询来重新编写带有嵌套查询的查询,但是oracle正在重写并且仍然在第一次执行userfunction(a)并且查询花费很长时间。

select *from (
    select *from t
    where
    and exists (select 1 from tab where t.abc='' ...etc)
    ..etc
    )
userfunction(a) = 0

也尝试使用WITH子句但没有运气。

oracle是否有任何想法不使用索引进行用户函数调用或在where子句中使用某些条件?

1 个答案:

答案 0 :(得分:0)

您的查询在逻辑上不一致:您引用表t和tab,但仅限于desribe t。假设您在编写选项卡时意味着,我无法理解您为什么需要带有子查询的exists子句。当subselect中的表达式求值为TRUE时,EXISTS将返回TRUE;那么为什么不在t?

的主查询中使用该表达式呢?