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