oracle 使用自定义函数查询条件效率非常低
来源:互联网 发布:java游戏代码大全 编辑:程序博客网 时间:2024/05/22 17:48
原文连接:http://blog.sina.com.cn/s/blog_6ff05a2c0100n2qo.html
我们平时在SQL语句的WHERE条件中使用函数是很常见的事情,考虑一下下面两个SQL在执行机制上有什么区别:
1. SELECT * FROM T WHERE col1 = UPPER('hello');2. SELECT * FROM T WHERE col1 = DBMS_RANDOM.VALUE(1,100);
UPPER('hello')经过处理后会变成'HELLO',它相当于一个常量,因此第1个SQL类似于:
SELECT * FROM T WHERE col1 = 'HELLO';
而第2个SQL由于DBMS_RANDOM.VALUE(1,100)是不确定的,因此不能进行处理。这就导致T表有多少行,DBMS_RANDOM.VALUE这个函数就要执行多少次。而第1个SQL其实只执行了很少次数的UPPER函数,与表T的行数无关。
如果我们想自己写一个函数SQUARE,实现平方的功能,那么在下面的SQL中,SQUARE函数会执行多少次呢?
SELECT * FROM T WHERE col = SQUARE(10);
1.创建一个包,包里面定义一个NUMBER类型的变量,初始值设为0。
2.在我们自己定义的函数中增加一个将全局变量+1的赋值操作,这样每调用一次该函数,全局变量就会增加1。
3.最后输出全局变量的值,就是该函数被调用过的次数。当然每次测试前要将全局变量清零。
如果我们在定义SQUARE函数时没有加deterministic属性,那么经过我的测试,SELECT * FROM T WHERE col = SQUARE(10);
这个SQL会执行ROWNUMBER次SQUARE函数,也就是如果表T有100行,那就执行100次。
如果我们在定义SQUARE函数时加上了deterministic属性,那么经过我的测试,SELECT * FROM T WHERE col = SQUARE(10);
这个SQL只会执行2次SQUARE函数,而不管表T有多少行。
因此给出结论:当我们自己创建函数时,如果能够确定该函数是确定的,那就一定要加上deterministic属性,这样在where条件中使用该函数会提高一大截性能!否则,你写的函数将来被多少人使用就是害了多少人!
阅读全文
0 0
- oracle 使用自定义函数查询条件效率非常低
- Oracle 查询使用union all 与 使用条件or 的查询效率比较
- ORACLE查询当前执行效率低的sql
- mybatis sql查询条件有时间时查询效率非常慢
- MySQL大数据使用limlit , 查询效率变低
- Oracle为了增加查询效率给条件字段添加索引
- oracle的查询&函数&效率问题
- 谨慎使用效率极低的std::list.size()函数
- Oracle模糊查询之(3.1从使用函数和sql语法角度来提高模糊查询效率 一)oracle模糊查询效率提高
- 虚函数为什么效率低
- 为什么虚函数效率低?
- 虚函数为什么效率低
- 使用Bulk Collect提高Oracle查询效率
- oracle 中如何在使用sum或其他聚合函数中,select查询条件处如何使用判断条件
- Oracle数据库查询条件使用三元表达式
- 【小小问题集锦6之---查询条件非常复杂时解决效率不高的一个办法】
- 小小问题集锦6之---查询条件非常复杂时解决效率不高的一个办法
- Oracle函数之非常实用的统计查询
- docker redis 快速启动
- struts2_day03_15_el表达式为什么获取值栈数据
- makefile中"模式规则"的引入和介绍------%:%.cpp
- select操作
- 求js数组的最大值和最小值的四种方法
- oracle 使用自定义函数查询条件效率非常低
- java调用http接口
- maven项目出现missing artifact错误解决办法
- 数据库概述
- Linux文件存储之inode、硬链接、软链接
- HDU 4283 You Are the One【区间DP】
- 二分排序
- android.mk中添加目录中所有cpp
- MySQL性能调优技巧