基于自定义函数的Function-Based索引创建
来源:互联网 发布:域名指向另一个域名 编辑:程序博客网 时间:2024/06/04 18:52
随便一个测试可以再现这个问题,我门创建一个函数(本范例函数用于进行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 DETERMINISTICIS 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
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. OnlyDETERMINISTIC
functions can be called from a function-based index or a materialized view that has query-rewrite enabled.
FROM:http://www.eygle.com/archives/2006/01/create_function_based_index.html
0 0
- 基于自定义函数的Function-Based索引创建
- 基于自定义函数的Function-Based索引创建
- 14.2 Using Function-based Indexes for Performance 使用基于函数的索引
- 关于函数索引(function-based index)
- 基于函数的索引+创建基于函数的索引
- DB2基于JAVA的自定义函数(user-defined-function)示例
- 基于函数的索引
- 基于函数的索引
- Oracle PL/SQL之函数索引(Function-based indexes)使用示例
- 【索引分类】基于函数的索引
- 创建基于模板的小部件 - Creating Template-based Widgets
- oracle 基于函数的索引
- 基于函数的索引浅析
- Oracle基于函数的索引
- Kernal-Based Object Tracking---基于核函数的目标跟踪
- sqlserver创建函数的实例(create function)
- sqlserver创建函数的实例(create function)
- 用Function类创建函数的缺点
- C++中类成员函数作为回调函数
- 第八章--分配内存
- Allegro学习笔记6:热风焊盘
- 北京3月去哪玩 赏花踏青登山六大推荐
- apache启动报错(98)Address already in use: make_sock: could not bind to address [::]:80
- 基于自定义函数的Function-Based索引创建
- 第九章--与硬件通信
- 一些应用
- [水]关于在线翻译
- 采购订单自动产生批次信息
- java程序会发生内存泄露的问题吗?请简单说说你的观点
- 大数据时代:安全第一,还是效率第一
- Android中的AAtomizer
- clang++诡异之处(续)