【发布时间】: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