oracle自定义函数的执行时间

oracle中的pl/sql代码会涉及到两个执行引擎,一个专门处理标准的SQL语句,另外一个处理pl/sql的过程代码,一般在引擎切换上会带来cpu额外的开销。比如foreach循环语句和普通for循环的区别,就是foreach消除了引擎切换,一直驻留在执行标准SQL的引擎中,从而缩短了执行时间。
现在有一个客户信息表tacustomer, 包含了birthday, certificatetype, certificateno等字段,现在想要获知客户的生日信息。由于客户注册时生日等字段是可选择填写项,故大多数为空,所以要从证件号码certificateno中提取,certificatetype为证件类型,除身份证之外还有军官证、士兵证、户口本等枚举值,输入的值也不可靠,本来'0'代表身份证,但由于录入错误,使得非'0'值可能也指身份证,而'0'也可能输入的不是身份证。结合这些考虑因素,写了一个函数,输入参数为上述三个字段,输出为生日的年份。写了两个版本,在笔者的windows2003数据库服务器上(Intel(R) Xeon(R) CPU 5140 @ 2.33GHZ,4cpu,4.00GB内存),执行语句如下(tacustomer行数为200百万左右):

-- 测试简单字符串连接的执行时间
SELECT COUNT(t.certificatetype || t.certificateno || t.birthday)
FROM tacustomer t
WHERE 1 = 1
AND ROWNUM < 2000000

-- 测试自定义函数的执行时间
SELECT COUNT(f_extract_birthday(t.certificatetype, t.certificateno, t.birthday))
FROM tacustomer t
WHERE 1 = 1
AND ROWNUM < 2000000

执行时间如下(秒):
8.563
19.844(版本1)
57.953(版本2)

可以看出基本是3倍的关系(将上面的条件改为ROWNUM < 1000000,同样满足3倍的关系),版本1和版本2之间的区别是内部实现不同。第一代身份证15位必须全为0-9的数字,第二代18位的前17位全为数字,最后一个为数字或'X'。版本1和2对这个是否数字的校验采用了不同的方式。版本1逐个检查,版本2用cast(certno as numeric)并捕捉异常的方式,结果版本2比1快3倍。从中得出的结论,自定义函数一般性能比不上系统内建函数。

附两个版本的代码:

时间: 2024-08-31 00:11:04

oracle自定义函数的执行时间的相关文章

oracle自定义函数的问题,求助大神啊

问题描述 oracle自定义函数的问题,求助大神啊 在oracle中定义一个函数,用来实现从身份证号中提取出生日期并将提取结果保存到指定表中.提示:提前创建一个至少包含(身份证 varchar2,出生日期 date)的二维表 小白初学oracle,这个问题做了一下午还没弄明白,各路大神给指点一下啊 解决方案 oracle自定义函数oracle 自定义函数oracle 自定义函数入门 解决方案二: 例:表1, 身份证:xxxxxx20150810xxxx ,求出生日期update 表1 set 出

oracle自定义函数如何转成mysql函数

问题描述 oracle自定义函数如何转成mysql函数 这是oracle自定义的函数,怎么把他转成mysql的 create or replace function fun_return_zjxl(in_taskId varchar2, in_work_no varchar2) return varchar2 is v_sum number(10);--质检平均完成量 v_num NUMBER(10);--质检个人完成量 v_qualitied_cnt NUMBER(10); v_result

oracle 自定义函数返回一个自定义整数列,如何在下一个自定义函数中,调用上一个函数

问题描述 oracle 自定义函数返回一个自定义整数列,如何在下一个自定义函数中,调用上一个函数 ---自定义类型 create or replace type t_int is table of integer -- Create table create table TESTFUNCTION ( oid INTEGER, result INTEGER ) tablespace USERS pctfree 10 initrans 1 maxtrans 255; -- Create table

Oracle自定义聚集函数

自定义聚集函数接口简介 Oracle提供了很多预定义好的聚集函数,比如Max(), Sum(), AVG(), 但是这些预定义的聚集函数基本上都是适应于标量数据(scalar data), 对于复杂的数据类型,比如说用户自定义的Object type, Clob等, 是不支持的. 但是,幸运的是, 用户可以通过实现Oracle的Extensibility Framework中的ODCIAggregate interface来创建自定义聚集函数,而且自定义的聚集函数跟内建的聚集函数用法上没有差别.

php自定义函数的基本语法结构

function 函数名(形参列表) { 函数体; return 语句;} 例:实现一个简单的加.减.乘.除计算器 test.php: <?phprequire 'funcs.php';$num1 = 56;$num2 = 44;$oper = "+";$res = jisuan($num1, $num2, $oper); //调用自定义函数echo "计算结果是:" . $res;?> funcs.php: <?phpfunction jisua

php实现的太平洋时间和北京时间互转的自定义函数分享_php实例

没有什么好说的了,直接上代码吧: /** * 太平洋时间转北京时间 */ public function pacificToPRC($time=''){ date_default_timezone_set('Pacific/Apia'); if(empty($time)){ $time = time(); } date_default_timezone_set('Asia/Shanghai'); $date = date('Y-m-d H:i:s',$time); $time = strtoti

Python中自定义函数的教程_python

在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数为例: def my_abs(x): if x >= 0: return x else: return -x 请自行测试并调用my_abs看看返回结果是否正确. 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.因此,函数内部通过条件判断和循环可以实现非常复杂

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://w

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

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