oracle创建自定义函数索引,Oracle技术之基于自定义函数的Function-Based索引创建

在Oracle数据库中,尝试为自定义函数创建索引时遇到'函数非确定性'错误。这表明Oracle无法保证函数每次调用时返回相同结果。为了解决此问题,需要在创建索引时使用DETERMINISTIC提示,明确指出函数的结果不会依赖于会话变量或模式对象。例如,一个用于十六进制到十进制转换的函数,如果没有指定DETERMINISTIC,将导致创建索引失败。正确指定该参数后,可以成功创建基于函数的索引,允许优化器优化查询性能。

在oralce中给自建函数创建索引,结果不成功。

source:Create Index IDX_T_SP_TWOTYPESTAT_0_f On T_SP_TWOTYPESTAT_0(f_dateadd(yearmonth,12,2));

err:the function is not deterministic.

我们看一下这是为什么?

随便一个测试可以再现这个问题,我门创建一个函数(本范例函数用于进行16进制向10进制转换):

4ce5b890cde2210279749aa09989e550.png

此时创建索引,获得如下错误信息:

86065e2df9c3ecc99a476631cff8c003.png

如果需要创建基于自定义函数的索引,那么我们需要指定deterministic参数:

aa3d3dd293e0b7ed3115ed004d3203d8.png

此时创建索引即可:

abd29a66a646480b1e555fa43c4c2c47.png

Oracle这样解释这个参数:

The hint DETERMINISTIC helps the optimizer avoid redundant function calls. If a stored function was called previously with the same arguments, the optimizer can elect to use the previous result. The function result should not depend on the state of session variables or schema objects. Otherwise, results might vary across calls. Only DETERMINISTIC functions can be called from a function-based index or a materialized view that has query-rewrite enabled.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值