2017-04-20 75 views
0

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

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

我试图通过移动功能,以嵌套查询重新编写与嵌套查询的查询,但甲骨文是重新书写,并在第一仍在执行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子句中的某些条件?

+0

什么是用户功能? –

+2

'userfunction(a)'或'userfunction(abc)'?我不认为问题在于Oracle使用索引来访问数据。但也许它可以使用更合适的索引。这将有助于查看整个查询。另外:'userfunction'是确定性的(即,如果我称之为明年,我是否会得到相同的结果)? –

+0

它是userfunction(abc)。这不是确定性的。基本上它是非常昂贵的功能,我希望这只能在最后和子句中调用。 – user1181858

回答

0

您的查询在逻辑上不一致:您参考表t和选项卡,但只能查询t。假设你在写选项卡时意味着t,我不明白为什么需要使用子查询的exists子句。当子查询中的表达式评估为TRUE时,EXISTS将仅返回TRUE;那么为什么不在t的主查询中使用该表达式呢?