[20181015]为什么是3秒.txt --//以前测试:连接http://blog.itpub.net/267265/viewspace-2144765/=>为什么是12秒.txt. --//很奇怪12.1.0.1版本测试12秒(windows版本),而11g是3秒(在使用标量子查询的情况下).不知道为什么? --//在12.2.0.1下测试看看: 1.环境: SCOTT@test01p> @ver1 PORT_STRING VERSION BANNER CON_ID ------------------------------ -------------- -------------------------------------------------------------------------------- ---------- IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0 SYS@test01p> grant EXECUTE ON dbms_lock to scott; Grant succeeded. 2.建立函数: CREATE OR REPLACE FUNCTION get_dept (p_deptno dept.deptno%TYPE) RETURN dept.dname%TYPE IS l_dname dept.dname%TYPE; BEGIN DBMS_LOCK.sleep (1); SELECT dname INTO l_dname FROM dept WHERE deptno = p_deptno; RETURN l_dname; END; / 3.测试: SCOTT@test01p> set timing on SCOTT@test01p> set feedback only SCOTT@test01p> select empno, ename, deptno, get_dept(deptno) c20 from emp; EMPNO ENAME DEPTNO C20 ---------- ---------- ---------- -------------------- 14 rows selected. Elapsed: 00:00:14.00 --//14秒,这是正确的,14条记录.调用14次需要14秒. --//换成标量子查询: SCOTT@test01p> select empno, ename, deptno, (select get_dept(deptno) from dual )c20 from emp; EMPNO ENAME DEPTNO C20 ---------- ---------- ---------- -------------------- 14 rows selected. Elapsed: 00:00:03.03 --//执行时间是3秒,这次是正确的,因为标量子查询缓存结果,而仅仅有3个部门在emp表.这样3秒就正确了. 4.继续探究: SCOTT@test01p> set timing off SCOTT@test01p> alter session set statistics_level=all; Session altered. SCOTT@test01p> select empno, ename, deptno, (select get_dept(deptno) from dual )c20 from emp; EMPNO ENAME DEPTNO C20 ---------- ---------- ---------- -------------------- 14 rows selected. SCOTT@test01p> set feedback on SCOTT@test01p> @ dpc '' '' PLAN_TABLE_OUTPUT ------------------------------------- SQL_ID apagxtf1p2puy, child number 1 ------------------------------------- select empno, ename, deptno, (select get_dept(deptno) from dual )c20 from emp Plan hash value: 1340320406 -------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | -------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | 9 (100)| | 14 |00:00:00.01 | 8 | | 1 | FAST DUAL | | 3 | 1 | | 2 (0)| 00:00:01 | 3 |00:00:00.01 | 0 | | 2 | TABLE ACCESS FULL| EMP | 1 | 14 | 182 | 3 (0)| 00:00:01 | 14 |00:00:00.01 | 8 | -------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$2 / DUAL@SEL$2 2 - SEL$1 / EMP@SEL$1 --//从执行计划也可以发现fast dual执行了3.再次说明12.1版本有问题. --//也再次说明oracle任何XX.1版本不能在生产系统使用. 5.继续测试使用 DETERMINISTIC Functions: --//一般如果在在某个函数定义索引,需要DETERMINISTIC,表示返回结果固定。其实即使不固定,也可以这样定义。 CREATE OR REPLACE FUNCTION get_dept (p_deptno dept.deptno%TYPE) RETURN dept.dname%TYPE DETERMINISTIC IS l_dname dept.dname%TYPE; BEGIN DBMS_LOCK.sleep (1); SELECT dname INTO l_dname FROM dept WHERE deptno = p_deptno; RETURN l_dname; END; / SCOTT@test01p> show array arraysize 200 --//arraysize=200 SCOTT@test01p> set timing on SCOTT@test01p> select empno, ename, deptno, get_dept(deptno) c20 from emp; ... 14 rows selected. Elapsed: 00:00:04.06 --//这次正确了4秒.大家可以自行设置array=2等各种情况. --//为什么?大家可以看看我写的.http://blog.itpub.net/267265/viewspace-2138042/=>[20170426]为什么是4秒.txt 6.最后补充测试RESULT CACHE的情况: CREATE OR REPLACE FUNCTION get_dept (p_deptno dept.deptno%TYPE) RETURN dept.dname%TYPE RESULT_CACHE IS l_dname dept.dname%TYPE; BEGIN DBMS_LOCK.sleep (1); SELECT dname INTO l_dname FROM dept WHERE deptno = p_deptno; RETURN l_dname; END; / SCOTT@test01p> select empno, ename, deptno, get_dept(deptno) c20 from emp; 14 rows selected. Elapsed: 00:00:03.07 SCOTT@test01p> select empno, ename, deptno, get_dept(deptno) c20 from emp; Elapsed: 00:00:00.07 --//第1次执行3秒,第2次执行0秒,因为结果缓存了.第二次执行直接取结果.修改如下结果一样. CREATE OR REPLACE FUNCTION get_dept (p_deptno dept.deptno%TYPE) RETURN dept.dname%TYPE RESULT_CACHE DETERMINISTIC IS l_dname dept.dname%TYPE; BEGIN DBMS_LOCK.sleep (1); SELECT dname INTO l_dname FROM dept WHERE deptno = p_deptno; RETURN l_dname; END; / 总结: --//再次验证我以前的结论oracle 任何xx.1版本不要在生产系统使用.
[20181015]为什么是3秒.txt
来源:这里教程网
时间:2026-03-03 12:05:34
作者:
编辑推荐:
- [20181015]为什么是3秒.txt03-03
- oracle 11g 单实例数据库的安装03-03
- Oracle 12CR2查询转换之视图合并03-03
- Word2010创建新的项目符号实例教程03-03
- word2010中怎样录制宏03-03
- ORACLE账户提示EXPIRED(GRACE)问题解决03-03
- Oracle 12CR2查询转换之谓词推送03-03
- Word2010中如何设定文档的自定义分栏03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- oracle 11g 单实例数据库的安装
oracle 11g 单实例数据库的安装
26-03-03 - 恩墨放大招|OCM直通之路系列课程免费听
恩墨放大招|OCM直通之路系列课程免费听
26-03-03 - ASM元数据之FST损坏的修复
ASM元数据之FST损坏的修复
26-03-03 - Oracle表 列字段的增加、删除、修改以及重命名操作sql
Oracle表 列字段的增加、删除、修改以及重命名操作sql
26-03-03 - 如何修复Word2007/2010文档中插入图片显示空白框的方法
如何修复Word2007/2010文档中插入图片显示空白框的方法
26-03-03 - Word2010页边距的设置图解
Word2010页边距的设置图解
26-03-03 - 18C新特性之PDB snapshot Carousel,够用吗?
18C新特性之PDB snapshot Carousel,够用吗?
26-03-03 - 利用Connect By构造数列
利用Connect By构造数列
26-03-03 - sqlldr 导入乱码解决办法
sqlldr 导入乱码解决办法
26-03-03 - Word2010中设置文档默认保存格式
Word2010中设置文档默认保存格式
26-03-03
