Oracle中利用DETERMINISTIC声明提高性能(二) 参数顺序对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的。

这一篇描述参数顺序对性能的影响。

上一篇文章提到了,如果希望通过DETERMINISTIC来获取性能收益,那么采用批量方式是必须的,而且数组的值相对而言越大对于性能的帮助会越大。

但是这里存在一个问题,如果需要处理的数据量本身很大,虽然重复的输入参数不少,但是总的参数不同的值更多,那么即使将ARRAY的值设置到1000,能带来的性能收益也很有限,因为即使1000次调用,也不能保证参数完全一样出现多次,而如果无限制的增大ARRAY,虽然从DETERMINISTIC函数的角度讲可以提高性能,但是对于内存的占用等其他方面,会带来性能的下降,显然一味的扩大批量并不是问题的解决之道。

其实解决这个问题很简单,就是在调用DETERMINISTIC函数之前,对函数的参数进行排序,确保相同的参数顺序调用,这样DETERMINISTIC函数执行的次数最少。

继续使用上一篇文章的例子,看看排序后DETERMINISTIC函数的调用次数:

SQL> UPDATE T_DETER SET C = 1;

已更新15行。

已用时间: 00: 00: 00.17

SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM T_DETER;

ID F_DETER(C) F_SYSDATE

---------- ---------- -------------------

1         1 2011-05-26 14:26:12

2         1 2011-05-26 14:26:13

3         1 2011-05-26 14:26:13

4         1 2011-05-26 14:26:13

5         1 2011-05-26 14:26:13

6         1 2011-05-26 14:26:13

7         1 2011-05-26 14:26:13

8         1 2011-05-26 14:26:13

9         1 2011-05-26 14:26:13

10         1 2011-05-26 14:26:13

11         1 2011-05-26 14:26:13

12         1 2011-05-26 14:26:13

13         1 2011-05-26 14:26:13

14         1 2011-05-26 14:26:13

15         1 2011-05-26 14:26:13

已选择15行。

1

1

已用时间: 00: 00: 02.29

SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM (SELECT * FROM T_DETER ORDER BY C);

ID F_DETER(C) F_SYSDATE

---------- ---------- -------------------

1         1 2011-05-26 14:26:35

15         1 2011-05-26 14:26:35

3         1 2011-05-26 14:26:35

4         1 2011-05-26 14:26:35

5         1 2011-05-26 14:26:35

6         1 2011-05-26 14:26:35

7         1 2011-05-26 14:26:35

8         1 2011-05-26 14:26:35

9         1 2011-05-26 14:26:35

10         1 2011-05-26 14:26:35

11         1 2011-05-26 14:26:35

12         1 2011-05-26 14:26:35

13         1 2011-05-26 14:26:35

14         1 2011-05-26 14:26:35

2         1 2011-05-26 14:26:35

已选择15行。

1

已用时间: 00: 00: 01.10

可以看到,由于执行了排序,DETERMINISTIC函数不用再次检查输入参数是否相等,因此在SQL运行期间只调用了一次:

SQL> SHOW ARRAY

arraysize 15

SQL> SET ARRAY 1

SQL> SELECT ID, F_DETER(C), F_SYSDATE FROM (SELECT * FROM T_DETER ORDER BY C);

ID F_DETER(C) F_SYSDATE

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-12-22 22:15:05

Oracle中利用DETERMINISTIC声明提高性能(二) 参数顺序对性能的影响的相关文章

Oracle中利用DETERMINISTIC声明提高性能(一) ARRAY对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述ARRAY对性能的影响. 关于DETERMINISTIC函数,以前已经写过一些文章了,不过对于DETERMINISTIC声明用来提高性能只是简单提了一句,并没有展开来说. 由于函数声明了DETERMINISTIC特性,Oracle对于相同的输入,可以只运行一次,而这对于代码比较复杂,调用时间较长的函数而言,确实可以提高性能. 但是在上面的几篇文章中也提到了,DETER

在Word文档中利用“一键粘贴”提高工作效率

剪贴键是Ctrl+X,复制键是Ctrl+C,粘贴键是Ctrl+V,从开始借助电脑开始 ,很多用户就先学会了这些.而这三个快捷键也是大家用的最多的.但在Office Word软件中,实际通过设置,可开启键盘"一键粘贴"功能,无需再 使用组合键,同样可粘贴文字内容. 设置方法非常简单,用户点击Office图标菜单,选择"Word"选 项,进入到"高级"选项卡中,此时在右侧找到并勾选"使用 Insert粘贴".点击确定.此时即可开启

Oracle中利用哈希函数提高查询速度

oracle|函数|速度 当数据存储在一个普通表中的时候,这些记录将以插入到数据库时的顺序物理地保存到分配的块中.例如,如果有一个用于存储员工信息的表,那么员工姓名将会按照插入到表的顺序存储在表中. 如果员工记录非常多的话,那么数据表的响应速度就会逐渐变慢.你可以通过选择值相对等分布的一列(如员工的部门编号)并建立一个簇表来提高查询员工的速度. 在簇表中,如果员工属于同一个部门,那么它们的记录将物理地存储在同一系列的块中.这样就可以提高查找员工信息的速度,这是因为在检索某个特定部门的员工时,需要

Oracle中利用存储过程建表

Oracle中存储过程不可以执行DDL语句,但是我们可以利用动态sql语句来建立表格. 如下:   代码 create or replace procedure spCreateTestTableis    v_CreateString varchar2(1000);begin    declare        v_count number;    begin        v_count := 0;                select count(*)        into v_c

Oracle中利用数据泵导出查询结果(二) 外部表的卸载功能

还是上一篇中的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT IN

在Oracle中利用REDO实现故障恢复

在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer.LGWR后台进程和Redo Log File (在归档模式下,Redo Log File最终会写出为归档日志文件). 在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图1所示. 图1 Oracle Instance Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变更的相关信息.这些 信息以重做条目(Redo Entries)形式存储(Redo

Oracle中利用自治事务实现审计功能

在一个事务(外层事务)中可以定义一个或几个自治事务.自治事务可以独立commit,不 对外层事务产生影响,同样外层事务的 rollback 也对自治事务没有影响. 假设现在 有这样一个需求,不能对某个表进行某些操作(如更新),一旦有这类操作,就强制整个回 滚,并且在审计日志中记录该次违规操作.现在的问题是当事务回滚之后,日志中的记录也 会跟着被回滚,这时就可以利用自治事务来防止这个问题. 首先,定义日志表,用于 审计. create table error_logs( id number(10)

ASP.NET MVC中利用脚本优化提高页面加载速度:

在这里我们说一下脚本优化的三个方法: 一.在我们做Web开发的时候,当我们引用Js文件的时候,我们一般会将js文件放在文档的head标签中,这时当页面加载的时候,浏览器会按着由上到下的顺序,当浏览器遇到script标签时,它会阻止其他内容的下载,知道他检索完整个脚本,这样会减慢页面加载速度,因此,script标签应该尽可能的放到页面的底部(仅仅位于body结束标签之前)就会产生很好的用户体验. 二.另一种减少页面加载时间的技术就是精简自定义脚本.比如我们经常用到的jquery.validate.

Oracle中利用数据泵导出查询结果(一) 数据泵的QUERY功能

在ITPUB上看到有人提出这个问题,能否利用数据泵导出一个查询结果.事实上数据泵还真的具有这个功能. 建立一个简单的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, N