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

在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进制转换):

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

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

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

此时创建索引即可:

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.

作者:51cto Oracle小混子

时间: 2024-12-22 13:17:51

Oracle技术:基于自定义函数的Function-Based索引创建的相关文章

JavaScript基于自定义函数判断变量类型的实现方法_javascript技巧

本文实例讲述了JavaScript基于自定义函数判断变量类型的实现方法.分享给大家供大家参考,具体如下: 通常用typeof来判断js变量的类型,但很多时候仅仅typeof满足不了要求的. 我写了一个自定义函数来做这个事,判断的比较全面了. function varType(v){ if ( typeof v=== "object" ){ if (v=== null ) return 'null' ; if (v. constructor ) return (v. constructo

oracle数据库编...-Oracle数据库的自定义函数

问题描述 Oracle数据库的自定义函数 创建一个通过雇员编号返回雇员名称及上级名称的函数get_emp_name,注意异常问题 解决方案 oracle数据库常用的一些自定义函数Oracle数据库 函数oracle数据库函数 解决方案二: 一个function只能返回一个值,返回雇员名称和上级名称可能要写两个function, 或者用procedure 的out去输出雇员名称和上级名称,这样一个procedure就可以

Oracle存储过程和自定义函数详解_oracle

概述 PL/SQL中的过程和函数(通常称为子程序)是PL/SQL块的一种特殊的类型,这种类型的子程序可以以编译的形式存放在数据库中,并为后续的程序块调用. 相同点: 完成特定功能的程序 不同点:是否用return语句返回值. 举个例子: create or replace procedure PrintStudents(p_staffName in xgj_test.username%type) as cursor c_testData is select t.sal, t.comm from

MySQL 自定义函数CREATE FUNCTION示例_Mysql

mysql> mysql> delimiter $$ mysql> mysql> CREATE FUNCTION myFunction -> (in_string VARCHAR(255), -> in_find_str VARCHAR(20), -> in_repl_str VARCHAR(20)) -> -> RETURNS VARCHAR(255) -> BEGIN -> DECLARE l_new_string VARCHAR(25

Oracle存储过程和自定义函数详解

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 (     参数1 IN NUMBER,     参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT   将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条   记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)  

Oracle技术:使用Index提示强制使用索引

虽然索引并不总会快于全表扫描,但是很多时候我们希望Oracle使用索引来执行某些SQL,这时候我们可以通过index hints来强制SQL使用index. Index Hints的格式如下: /*+ INDEX ( table [index [index]...] ) */我们简单看一下这个提示的用法(范例为Oracle10g数据库): SQL> create table t as select username,password from dba_users;Table created.SQ

警惕!自定义函数索引的那些陷阱及避坑术

作者介绍 丁俊,DBAplus社群联合发起人,新炬网络专家团成员,性能优化专家,Oracle ACEA,ITPUB开发版资深版主.十年电信行业从业经验,从事过系统开发与维护.业务架构和数据分析.系统优化等工作.电子工业出版社终身荣誉作者,<剑破冰山-Oracle开发艺术>副主编.   当我们对列使用了函数运算之后,如果此列没有函数索引,那么普通索引是无效的.比如where substr(name,1,3)='abc';如果建立了create INDEX idx_t ON t(NAME);  

SQL Server BUG集之自定义函数与group by

server|函数 /**==** 1. 自定义函数用于group by时出错 **==**/--一个简单的函数create function f_str(@str sysname,@i int)returns char(1)as begin  return(substring(@str,@i,1)) endgo --下面是测试 --定义测试数据declare @t table(name sysname)insert into @t values('abcd') --有group by的情况,结

用Actionscript 2.0创建平面坐标系并描绘自定义函数图像

创建|函数 代码: //创建坐标轴: //用法:Axis(所属影片,原点的x坐标,原点的y坐标,步长,刻度线长,-x轴长,+x轴长,-y轴长,+y轴长,颜色,深度) var my_axis1 = new Axis(this, 160, 108, 50, 10, -150, 300, -100, 80, 0x000000, 1); var my_axis2 = new Axis(this, 280, 255, 25, 4, -250, 200, -100, 100, 0xff0000, 2); /