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

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

这一篇描述ARRAY对性能的影响。

关于DETERMINISTIC函数,以前已经写过一些文章了,不过对于DETERMINISTIC声明用来提高性能只是简单提了一句,并没有展开来说。

由于函数声明了DETERMINISTIC特性,Oracle对于相同的输入,可以只运行一次,而这对于代码比较复杂,调用时间较长的函数而言,确实可以提高性能。

但是在上面的几篇文章中也提到了,DETERMINISTIC是基于调用的,因此使用DETERMINISTIC不但与输入参数是否重复有关,也与SQL调用次数有关。

一个前面文章提到过的简单的例子就是sqlplus的数组方式FETCH数据,不同的array的值,就会影响DETERMINISTIC函数的运行次数,哪怕

不过这里要澄清以前一个错误的观点,由于设置ARRAY为1后,访问DETERMINISTIC函数发现每两条记录调用一次,当时认为ARRAY方式的最小值是2,但是现在发现,问题和ARRAY无关,导致问题的原因和DETERMINISTIC的实现算法有关。

由于DETERMINISTIC并不像RESULT_CACHE那样,在单独的内存区域中保存每次调用的结果,因此Oracle需要判断DETERMINISTIC函数两次输入是否一样,这对于输入参数相同的情况还简单一些,但是对于包含大量变化的变量,就使得函数的调用次数很难预料。

看一个简单的例子来说明这个问题:

SQL> CREATE OR REPLACE FUNCTION F_DETER (V_IN NUMBER)

2 RETURN NUMBER DETERMINISTIC AS

3 BEGIN

4 DBMS_LOCK.SLEEP(1);

5 DBMS_OUTPUT.PUT_LINE(V_IN);

6 RETURN V_IN;

7 END;

8 /

函数已创建。

SQL> CREATE TABLE T_DETER (ID NUMBER, C NUMBER);

表已创建。

SQL> INSERT INTO T_DETER

2 SELECT ROWNUM, 1

3 FROM TAB;

已创建15行。

SQL> SET SERVEROUT ON

SQL> SET TIMING ON

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

已用时间: 00: 00: 00.09

SQL> SHOW ARRAY

arraysize 15

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

ID F_DETER(C) SYSDATE

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

1 1 2011-05-26 08:10:54

2 1 2011-05-26 08:10:54

3 1 2011-05-26 08:10:54

4 1 2011-05-26 08:10:54

5 1 2011-05-26 08:10:54

6 1 2011-05-26 08:10:54

7 1 2011-05-26 08:10:54

8 1 2011-05-26 08:10:54

9 1 2011-05-26 08:10:54

10 1 2011-05-26 08:10:54

11 1 2011-05-26 08:10:54

12 1 2011-05-26 08:10:54

13 1 2011-05-26 08:10:54

14 1 2011-05-26 08:10:54

15 1 2011-05-26 08:10:54

已选择15行。

1

1

已用时间: 00: 00: 02.80

SQL> CREATE OR REPLACE FUNCTION F_SYSDATE RETURN DATE AS

2 BEGIN

3 RETURN SYSDATE;

4 END;

5 /

函数已创建。

已用时间: 00: 00: 00.04

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

ID F_DETER(C) F_SYSDATE

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

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

2 1 2011-05-26 08:11:14

3 1 2011-05-26 08:11:14

4 1 2011-05-26 08:11:14

5 1 2011-05-26 08:11:14

6 1 2011-05-26 08:11:14

7 1 2011-05-26 08:11:14

8 1 2011-05-26 08:11:14

9 1 2011-05-26 08:11:14

10 1 2011-05-26 08:11:14

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

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

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

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

15 1 2011-05-26 08:11:14

时间: 2024-08-03 17:06:08

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

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

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述参数顺序对性能的影响. 上一篇文章提到了,如果希望通过DETERMINISTIC来获取性能收益,那么采用批量方式是必须的,而且数组的值相对而言越大对于性能的帮助会越大. 但是这里存在一个问题,如果需要处理的数据量本身很大,虽然重复的输入参数不少,但是总的参数不同的值更多,那么即使将ARRAY的值设置到1000,能带来的性能收益也很有限,因为即使1000次调用,也不能保

在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)

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

linux中利用vmstat和iostat命令查看linux的性能

vmstat和iostat是linux重要的两个的性能监控工具. vmstat - 内存,进程和分页等的简要信息 procs r 表示多少进程正在等待cpu b 表示多少进程正在不可中断地休眠(通常意味正在等待I/O如磁盘.网络.用户输入等) memory swpd 多少块被换出到磁盘 free 多少块是空闲的 buff 多少块正在被用作缓冲 cache 多少块正在被用作操作系统的缓存 swap(页面交换活动) si 多少块正在从磁盘换入 so 多少块正在换出到磁盘 io bi 多少块从块磁盘设