【问题标题】:Oracle no index for function calls in sql queryoracle在sql查询中没有函数调用的索引
【发布时间】: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 子句中调用。

标签: oracle performance query-optimization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多