基于自定义函数的Function-Based索引创建
2017-01-24 00:00
585 查看
在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进制转换):
此时创建索引,获得如下错误信息:
如果需要创建基于自定义函数的索引,那么我们需要指定deterministic参数:
此时创建索引即可:
Oracle这样解释这个参数:
The hint
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进制转换):
CREATE OR REPLACE FUNCTION h2ten ( p_str IN VARCHAR2, p_from_base IN NUMBER DEFAULT 16 ) RETURN NUMBER IS l_num NUMBER DEFAULT 0; l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF'; BEGIN FOR i IN 1 .. LENGTH (p_str) LOOP l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1; END LOOP; RETURN l_num; END h2ten;
此时创建索引,获得如下错误信息:
SQL> create table t as select username,'a' hex from dba_users; Table created SQL> create index i_t on t (h2ten(hex)); create index i_t on t (h2ten(hex)) ORA-30553: The function is not deterministic
如果需要创建基于自定义函数的索引,那么我们需要指定deterministic参数:
CREATE OR REPLACE FUNCTION h2ten ( p_str IN VARCHAR2, p_from_base IN NUMBER DEFAULT 16 ) RETURN NUMBER DETERMINISTIC IS l_num NUMBER DEFAULT 0; l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF'; BEGIN FOR i IN 1 .. LENGTH (p_str) LOOP l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1; END LOOP; RETURN l_num; END h2ten;
此时创建索引即可:
SQL> create index i_t on t (h2ten(hex)); Index created
Oracle这样解释这个参数:
The hint
DETERMINISTIChelps 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
DETERMINISTICfunctions can be called from a function-based index or a materialized view that has query-rewrite enabled.
相关文章推荐
- Oracle技术之基于自定义函数的Function-Based索引创建
- 基于自定义函数的Function-Based索引创建
- 基于自定义函数的Function-Based索引创建
- oracle自定义函数创建函数索引
- DB2基于JAVA的自定义函数(user-defined-function)示例
- 对自定义函数建立索引时抛异常--ORA-30553: 函数不能确定(ORA-30553: The function is not deterministic)解决方法
- 基于函数的索引+创建基于函数的索引
- mysql 创建函数(function)
- 如何创建oracle函数索引
- Flash8中自定义函数function
- 函数索引 ORA-30553: The function is not deterministic 解决方法
- 函数索引 ORA-30553: The function is not deterministic 解决方法
- 在SQL中创建函数索引
- DB2 FUNCTION【DB2中增加自定义函数】
- 如何在基于MFC的环境中使用自定义消息函数?
- 函数索引 ORA-30553: The function is not deterministic 解决方法
- 使用索引的误区之三:基于函数的索引
- Oracle基础学习三:过程PROCEDURE 和函数FUNCTION 的创建及调用
- [翻译:ASP.NET MVC 教程]创建自定义HTML辅助函数
- [SQL Server]创建自定义聚合函数值得注意的问题