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

Posted

技术标签:

【中文标题】oracle在sql查询中没有函数调用的索引【英文标题】:Oracle no index for function calls in sql query 【发布时间】:2017-04-20 05:57:31 【问题描述】:

我有一个名为 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 子句中的某些条件吗?

【问题讨论】:

什么是用户函数? userfunction(a)userfunction(abc)?我认为问题不在于 Oracle 使用索引来访问数据。但也许它可以利用更合适的索引。这将有助于查看整个查询。另外:userfunction 是确定性的吗(即,如果我调用它,比如明年,我会为相同的值得到相同的结果)吗? 它是用户函数(abc)。它不是确定性的。基本上它是一个非常昂贵的函数,我希望它只在最后一个 and 子句中调用。 【参考方案1】:

您的查询在逻辑上不一致:您引用了表 t 和选项卡,但仅描述了 t。假设您在编写选项卡时的意思是 t,我不明白为什么您需要带有子查询的 exists 子句。当子选择中的表达式计算为 TRUE 时,EXISTS 只会返回 TRUE;那么为什么不在 t 的主查询中使用该表达式呢?

【讨论】:

以上是关于oracle在sql查询中没有函数调用的索引的主要内容,如果未能解决你的问题,请参考以下文章

oracle如何获取调用者的IP,机器名等信息,以及他们操作的SQL

oracle sql语句中,有没有能够将结果集中数字替换成汉字的函数?

[性能调优]在PeopleSoft中使用函数索引

索引优化原则及Oracle中索引总结

oracle中decode函数如何提升查询语句性能的?

oracle有没有类似sqlserver中include语句的覆盖索引?