Oracle11新特性——PLSQL函数缓存结果

[复制链接]
查看11 | 回复3 | 2010-2-11 01:01:06 | 显示全部楼层 |阅读模式
Oracle11g新增的SQL缓存结果集的功能前面已经介绍过了。同时Oracle对PL/SQL的函数也进行了相应的增加。允许函数缓存返回结果。
先看一个简单的例子:
[PHP]
SQL> CREATE TABLE T AS SELECT * FROM DBA_SOURCE;
表已创建。
SQL> CREATE OR REPLACE FUNCTION F_NO_RESULT_CACHE RETURN NUMBER AS
2 V_RETURN NUMBER;
3BEGIN
4 SELECT COUNT(*) INTO V_RETURN FROM T;
5 RETURN V_RETURN;
6END;
7/
函数已创建。
SQL> SET TIMING ON
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用时间:00: 00: 12.26
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用时间:00: 00: 07.53
SQL> SELECT F_NO_RESULT_CACHE FROM DUAL;
F_NO_RESULT_CACHE
-----------------
593334
已用时间:00: 00: 08.17
.
[/PHP]
对于普通的函数,需要每次都重新执行,而如果采用了RESULT_CACHE功能:
[PHP]
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE RETURN NUMBER RESULT_CACHE AS
2 V_RETURN NUMBER;
3BEGIN
4 SELECT COUNT(*) INTO V_RETURN FROM T;
5 RETURN V_RETURN;
6END;
7/
函数已创建。
已用时间:00: 00: 00.03
SQL> SELECT F_RESULT_CACHE FROM DUAL;
F_RESULT_CACHE
--------------
593334
已用时间:00: 00: 07.87
SQL> SELECT F_RESULT_CACHE FROM DUAL;
F_RESULT_CACHE
--------------
593334
已用时间:00: 00: 00.06
SQL> DISC
从 Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开
SQL> CONN YANGTK/yangtk@ORA11G
已连接。
SQL> SELECT F_RESULT_CACHE FROM DUAL;
F_RESULT_CACHE
--------------
593334
已用时间:00: 00: 00.04
.
[/PHP]
对于采用了RESULT_CACHE的函数,Oracle自动将函数的返回结果缓存,下次执行的时候,不会实际执行函数,而是直接返回结果。
而且由于缓存的结果存储在SGA中,因此所有的会话可以共享这个结果。在上面的例子中,断开连接并重建登陆后,新的会话也是可以利用存储在SGA中的函数缓存的。
注意,函数的RESULT_CACHE功能自动和函数的输入参数关联,即使输入参数不起任何作用,不同的输入参数也会导致RESULT_CACHE不生效。
[PHP]
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE(P_IN NUMBER) RETURN NUMBER RESULT_CACHE AS
2 V_RETURN NUMBER;
3BEGIN
4 SELECT COUNT(*) INTO V_RETURN FROM T;
5 RETURN V_RETURN;
6END;
7/
函数已创建。
已用时间:00: 00: 00.07
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用时间:00: 00: 06.90
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用时间:00: 00: 00.04
SQL> SELECT F_RESULT_CACHE(2) FROM DUAL;
F_RESULT_CACHE(2)
-----------------
593334
已用时间:00: 00: 07.15
.
[/PHP]
下面看一下RELIES_ON语句对RESULT_CACHE的影响。建立了上面的函数只完成了一部分功能,如果函数中访问了数据库中的对象,那么需要指定RELIES_ON语句来说明结果依赖的对象。如果没有制定,会导致函数访问的数据变化后,RESULT CACHE仍然生效,这时候会返回错误的结果:
[PHP]
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593334
已用时间:00: 00: 08.11
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用时间:00: 00: 00.34
SQL> DELETE T WHERE ROWNUM = 1;
已删除 1 行。
已用时间:00: 00: 00.04
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593333
已用时间:00: 00: 08.23
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用时间:00: 00: 00.06
SQL> COMMIT;
提交完成。
已用时间:00: 00: 00.03
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593334
已用时间:00: 00: 00.06
.
[/PHP]
由于没有指定依赖关系,Oracle并不会自动维护RESULT CACHE的正确性,这种依赖关系需要在建立函数的时候通过RELIES_ON来建立:
[PHP]
SQL> EXEC DBMS_RESULT_CACHE.FLUSH
PL/SQL 过程已成功完成。
已用时间:00: 00: 00.03
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE(P_IN NUMBER)
2 RETURN NUMBER RESULT_CACHE RELIES_ON (T) AS
3 V_RETURN NUMBER;
4BEGIN
5 SELECT COUNT(*) INTO V_RETURN FROM T;
6 RETURN V_RETURN;
7END;
8/
函数已创建。
已用时间:00: 00: 00.04
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593333
已用时间:00: 00: 09.60
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593333
已用时间:00: 00: 04.82
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593333
已用时间:00: 00: 00.06
SQL> DELETE T WHERE ROWNUM = 1;
已删除 1 行。
已用时间:00: 00: 00.03
SQL> SELECT COUNT(*) FROM T;
COUNT(*)
----------
593332
已用时间:00: 00: 00.26
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------
593332
已用时间:00: 00: 00.29
.
[/PHP]
添加了RELIES_ON语句后,Oracle会根据依赖对象自动INVALIDATE结果集,从而保证RESULT CACHE的正确性。

原文出自:http://yangtingkun.itpub.net/post/468/393972
回复

使用道具 举报

千问 | 2010-2-11 01:01:06 | 显示全部楼层
上一篇介绍了11g的PLSQL函数缓存结果。这里简单说明一下RESULT_CACHE和DETERMINISTIC函数的区别。
如果了解DETERMINISTIC功能,会发现DETERMINISTIC函数和RESULT_CACHE有功能类似之处。两种方法在函数输入相同的时候,都可以避免函数的再次执行。不过二者的实现方式不同,所以表现出来的很多特点也不相同。
DETERMINISTIC函数的主要意义是告诉Oracle,当这个函数输入的参数确定时,输出也是确定的。而Oracle利用了这个功能,因此在一次函数调用中出现多次重复调用时,对函数只调用一次。
而11g新增的RESULT_CACHE则不然,这个方法是通过将函数调用的结果保存在SGA的RESULT CACHE中来实现的。当Oracle执行一个函数时,如果在RESULT CACHE中可以找到相关的结果,那么Oracle就不会再次执行这个函数,而直接将结果返回。
了解了这两个功能的实现方法,也就清楚了二者的区别。对于DETERMINISTIC功能而言,只有一次调用中的函数重复执行,才能避免函数的多次执行。而对于RESULT_CACHE而言,由于结果被SGA进行缓存,随后的调用都可以利用这个结果,而且其他的SESSION也是可以共享这个结果的。
用一个简单的例子来说明这个问题:
[PHP]
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS
2BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5END;
6/
Function created.
SQL> CREATE OR REPLACE FUNCTION F_RESULT_CACHE (P_ID NUMBER) RETURN NUMBER RESULT_CACHE AS
2BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5END;
6/
Function created.
SQL> CREATE OR REPLACE FUNCTION F_DETERMINISTIC (P_ID NUMBER) RETURN NUMBER DETERMINISTIC AS
2BEGIN
3 DBMS_LOCK.SLEEP(5);
4 RETURN 1;
5END;
6/
Function created.
SQL> SET TIMING ON
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;
F_DETERMINISTIC(1)
------------------

1
Elapsed: 00:00:05.05
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;
F_DETERMINISTIC(1)
------------------

1
Elapsed: 00:00:05.01
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------

1
Elapsed: 00:00:05.14
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------

1
Elapsed: 00:00:00.00
.
[/PHP]
从这里就可以看到二者的区别。DETERMINISTIC函数只对一次调用中的重复生效:
[PHP]
SQL> SELECT F_DETERMINISTIC(3) FROM TAB;
F_DETERMINISTIC(3)
------------------

1

1

1

1

1

1
6 rows selected.
Elapsed: 00:00:10.04
SQL> SELECT F_RESULT_CACHE(3) FROM TAB;
F_RESULT_CACHE(3)
-----------------

1

1

1

1

1

1
6 rows selected.
Elapsed: 00:00:05.02
.
[/PHP]
由于SQLPLUS批量数组读取的机制,导致DETERMINISTIC方法对函数调用了两次。而RESULT_CACHE在一个查询中马上就可以使用前面语句得到的结果,所以函数只调用了一次。
DETERMINISTIC函数与SQLPLUS的ARRAYSIZE的关系的详细描述可以参考:
[PHP]
SQL> host
[oracle@yangtk ~]$ sqlplus yangtk/yangtk
SQL*Plus: Release 11.1.0.6.0 - Production on Mon Sep 10 15:33:14 2007
Copyright (c) 1982, 2007, Oracle.All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> SET TIMING ON
SQL> SELECT F_DETERMINISTIC(1) FROM DUAL;
F_DETERMINISTIC(1)
------------------

1
Elapsed: 00:00:05.01
SQL> SELECT F_RESULT_CACHE(1) FROM DUAL;
F_RESULT_CACHE(1)
-----------------

1
Elapsed: 00:00:00.00
.
[/PHP]
DETERMINISTIC函数对于多次调用都无能为力,更不用说不同SESSION之间共享结果了。而使用了SGA的RESULT_CACHE则就是为了多个SESSION共享而设计的。

原文出自:http://yangtingkun.itpub.net/post/468/394111
回复

使用道具 举报

千问 | 2010-2-11 01:01:06 | 显示全部楼层
上两篇介绍了11g的PLSQL函数缓存结果,以及RESULT_CACHE和DETERMINISTIC的区别。
这里简单介绍一下利用函数缓冲结果来提高性能的具体例子。前面的例子中都是读取表的数据,如果一些复杂的函数是被重复调用的,即使这些函数并没有访问数据库中的表,也是可以通过RESULT_CAHCE来获取性能的提升的。
前一段时间实现过一个利用PL/SQL进行大数据量的运算的功能。由于要计算100的阶乘,最终的结果超过了Oracle的number类型的上限。为了解决这个问题,只能将NUMBER转为为字符串,于是写了两个函数,分别以字符串的形式来实现数值的“加”和“乘”。由于计算量比较大,且包含了大量的递归调用和重复调用,将函数设置为RESULT_CACHE效果比较明显。
关于阶乘和算法的详细描述可以参考这篇文章:数值超过NUMBER最大表示范围的问题(四):http://yangtingkun.itpub.net/post/468/241044
[PHP]
SQL> CREATE OR REPLACE FUNCTION F_ADD_STR(P_ADD1 IN VARCHAR2, P_ADD2 IN VARCHAR2) RETURN VARCHAR2 AS
2 V_LENGTH1 NUMBER DEFAULT LENGTH(P_ADD1);
3 V_LENGTH2 NUMBER DEFAULT LENGTH(P_ADD2);
4BEGIN
5 IF V_LENGTH1 > 37 THEN
6RETURN
7 F_ADD_STR
8 (
9SUBSTR(P_ADD1, 1, V_LENGTH1 - 37),
10NVL
11(
12 SUBSTR
13 (
14F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2),
151,
16LENGTH(F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2)) - 37
17 ),
18 '0'
19)
20 )
21 || SUBSTR(F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2), - 37);
22 ELSIF V_LENGTH2 > 37 THEN
23RETURN
24 F_ADD_STR
25 (
26NVL
27(
28 SUBSTR
29 (
30F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36)),
311,
32LENGTH(F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36))) - 37
33 ),
34 '0'
35),
36SUBSTR(P_ADD2, 1, V_LENGTH2 - 37)
37 )
38 || SUBSTR(F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36)), - 37);
39 ELSE
40RETURN
41 LTRIM
42 (
43TO_CHAR
44(
45 TO_NUMBER(P_ADD1) + TO_NUMBER(P_ADD2),
46 RPAD
47 (
48'0',
49GREATEST(V_LENGTH1, V_LENGTH2, LENGTH(TO_NUMBER(P_ADD1) + TO_NUMBER(P_ADD2))),
50'9'
51 )
52)
53 );
54 END IF;
55END;
56/
函数已创建。
SQL> CREATE OR REPLACE FUNCTION F_MULTI_STR(P_MUL1 IN VARCHAR2, P_MUL2 IN VARCHAR2) RETURN VARCHAR2 AS
2 V_LENGTH1 NUMBER DEFAULT LENGTH(P_MUL1);
3 V_LENGTH2 NUMBER DEFAULT LENGTH(P_MUL2);
4BEGIN
5 IF V_LENGTH1 > 19 THEN
6RETURN F_ADD_STR(F_MULTI_STR(SUBSTR(P_MUL1, 1, V_LENGTH1 - 19), P_MUL2) || LPAD('0', 19, '0'),
7 F_MULTI_STR(SUBSTR(P_MUL1, V_LENGTH1 - 18), P_MUL2));
8 ELSIF V_LENGTH2 > 19 THEN
9RETURN F_ADD_STR(F_MULTI_STR(P_MUL1, SUBSTR(P_MUL2, 1, V_LENGTH2 - 19)) || LPAD('0', 19, '0'),
10 F_MULTI_STR(P_MUL1, SUBSTR(P_MUL2, V_LENGTH2 - 18)));
11 ELSE
12RETURN TO_NUMBER(P_MUL1) * TO_NUMBER(P_MUL2);
13 END IF;
14END;
15/
函数已创建。
SQL> CREATE OR REPLACE FUNCTION F_MULTI_SUM_PLSQL(P_IN IN NUMBER) RETURN VARCHAR2 IS
2 V_RESULT_MULTI VARCHAR2(32767) DEFAULT '1';
3 V_RESULT VARCHAR2(32767) DEFAULT '0';
4BEGIN
5 FOR I IN 1..P_IN LOOP
6V_RESULT_MULTI := F_MULTI_STR(V_RESULT_MULTI, I);
7V_RESULT := F_ADD_STR(V_RESULT, V_RESULT_MULTI);
8 END LOOP;
9 RETURN V_RESULT;
10END;
11/
函数已创建。
SQL> SET TIMING ON
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 02.31
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 02.31
.
[/PHP]
第一个函数计算两个字符串表示的数值的“加”。第二个函数计算两个字符串表示的数值的“乘”。第三个函数通过调用前面两个函数计算任意数值的阶乘。
计算300的阶乘,第一次执行和第二次执行时间完全相同。
下面将前两个函数设置为RESULT_CACHE:
[PHP]
SQL> SET TIMING OFF
SQL> CREATE OR REPLACE FUNCTION F_ADD_STR(P_ADD1 IN VARCHAR2, P_ADD2 IN VARCHAR2) RETURN VARCHAR2
2 RESULT_CACHE AS
3 V_LENGTH1 NUMBER DEFAULT LENGTH(P_ADD1);
4 V_LENGTH2 NUMBER DEFAULT LENGTH(P_ADD2);
5BEGIN
6 IF V_LENGTH1 > 37 THEN
7RETURN
8 F_ADD_STR
9 (
10SUBSTR(P_ADD1, 1, V_LENGTH1 - 37),
11NVL
12(
13 SUBSTR
14 (
15F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2),
161,
17LENGTH(F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2)) - 37
18 ),
19 '0'
20)
21 )
22 || SUBSTR(F_ADD_STR(SUBSTR(P_ADD1, V_LENGTH1 - 36), P_ADD2), - 37);
23 ELSIF V_LENGTH2 > 37 THEN
24RETURN
25 F_ADD_STR
26 (
27NVL
28(
29 SUBSTR
30 (
31F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36)),
321,
33LENGTH(F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36))) - 37
34 ),
35 '0'
36),
37SUBSTR(P_ADD2, 1, V_LENGTH2 - 37)
38 )
39 || SUBSTR(F_ADD_STR(P_ADD1, SUBSTR(P_ADD2, V_LENGTH2 - 36)), - 37);
40 ELSE
41RETURN
42 LTRIM
43 (
44TO_CHAR
45(
46 TO_NUMBER(P_ADD1) + TO_NUMBER(P_ADD2),
47 RPAD
48 (
49'0',
50GREATEST(V_LENGTH1, V_LENGTH2, LENGTH(TO_NUMBER(P_ADD1) + TO_NUMBER(P_ADD2))),
51'9'
52 )
53)
54 );
55 END IF;
56END;
57/
函数已创建。
SQL> CREATE OR REPLACE FUNCTION F_MULTI_STR(P_MUL1 IN VARCHAR2, P_MUL2 IN VARCHAR2) RETURN VARCHAR2
2 RESULT_CACHE AS
3 V_LENGTH1 NUMBER DEFAULT LENGTH(P_MUL1);
4 V_LENGTH2 NUMBER DEFAULT LENGTH(P_MUL2);
5BEGIN
6 IF V_LENGTH1 > 19 THEN
7RETURN F_ADD_STR(F_MULTI_STR(SUBSTR(P_MUL1, 1, V_LENGTH1 - 19), P_MUL2) || LPAD('0', 19, '0'),
8 F_MULTI_STR(SUBSTR(P_MUL1, V_LENGTH1 - 18), P_MUL2));
9 ELSIF V_LENGTH2 > 19 THEN
10RETURN F_ADD_STR(F_MULTI_STR(P_MUL1, SUBSTR(P_MUL2, 1, V_LENGTH2 - 19)) || LPAD('0', 19, '0'),
11 F_MULTI_STR(P_MUL1, SUBSTR(P_MUL2, V_LENGTH2 - 18)));
12 ELSE
13RETURN TO_NUMBER(P_MUL1) * TO_NUMBER(P_MUL2);
14 END IF;
15END;
16/
函数已创建。
SQL> SET TIMING ON
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 02.09
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 02.06
.
[/PHP]
将两个函数设置为RESULT_CACHE后,第一次调用性能就提高了20%左右。第二次调用还有少量的性能提示。
需要注意的是,RESULT_CACHE内存区域并非越大越好,如果设置过大,Oracle可能会保留很多只调用一次的结果,而增加了在内存中查询结果的代价。
[PHP]
SQL> SHOW PARAMETER RESULT_CACHE
NAME
TYPEVALUE
------------------------------------ ----------- --------------------
client_result_cache_lag
big integer 3000
client_result_cache_size
big integer 0
result_cache_max_result
integer 5
result_cache_max_size
big integer 1312K
result_cache_mode
stringMANUAL
result_cache_remote_expiration integer 0
SQL> ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE = 10M;
系统已更改。
已用时间:00: 00: 00.45
SQL> EXEC DBMS_RESULT_CACHE.FLUSH
PL/SQL 过程已成功完成。
已用时间:00: 00: 00.03
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 12.45
SQL> SELECT F_MULTI_SUM_PLSQL(300) FROM DUAL;
F_MULTI_SUM_PLSQL(300)
----------------------------------------------------------------------------------------------------
3070811274246159831197867634735326011064421523237815764258614271944425390329825533018837351951336353
2235567428200830358057739028888300339437961308469410854940060024340706056649310321571207197011748410
0968282994169648643749490257480706100673731447522894095305459932231841943597483955828501619780513476
3376663859224945830611300526564703815407485636159087424745165046880274902036249095824669917834211373
5325115691474092861090708825215256177119827415812344886262517033400922474794786847386211079948043235
528920420940313
已用时间:00: 00: 02.81
.
[/PHP]
而且需要注意的是,对于新功能来说,一般总会伴随着很多的bug,RESULT CACHE也不例外。我在测试过程中就碰到过几次,当时重建基表甚至重建函数且改变了函数的逻辑,都无法INVALIDATE结果集,查询得到的都是以前的结果。不过这个bug现在已经无法重现了。
原文出自:http://yangtingkun.itpub.net/post/468/394887
回复

使用道具 举报

千问 | 2010-2-11 01:01:06 | 显示全部楼层
够复杂的,慢慢研究咯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行