[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的更多相关文章

  1. [20181015]12C SQL Translation Framework.txt

    [20181015]12C SQL Translation Framework.txt --//12c提供一个dba改写sql语句的可能性,实际上10g,11g之前也有一个包DBMS_ADVANCED ...

  2. [20170909]为什么是12秒.txt

    [20170909]为什么是12秒.txt --//在开发程序时我一般会强调开发尽量不要写一些自定义函数,往往可能导致CPU忙.--//例子很像这样: CREATE OR REPLACE FUNCTI ...

  3. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  4. Linux内核配置选项

    http://blog.csdn.net/wdsfup/article/details/52302142 http://www.manew.com/blog-166674-12962.html Gen ...

  5. 带UI的小初高数学学习软件

    结对编程项目总结   一.项目需求分析与功能总结 (1)用户注册功能 用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册. (2)设置密码功能 密码6-10位,必须含大小写字母和数 ...

  6. HNU_小初高数学学习软件_功能说明

    结对编程项目主要功能: 1.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: 2.用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功.密码6-1 ...

  7. 结对编程-如何用精简的java代码写出这个系统

    [写在前面]这篇博客是软件工程这门课中要求结对编程.规则是这样的:结对的两个人,分别看对方个人项目代码,2天时间内,分析对方代码优点和缺点.我是来分析凌嘉文同学的代码. 先写一下个人项目中的项目需求, ...

  8. 1:wamp如何更改网站根目录DocumentRoot 2:php的error_log文件(txt)会每秒几十K增大

    wamp如何更改网站根目录DocumentRoot     想必很多人都使用wamp来开发php的web应用吧,同时某些情况下我们或许需要修改服务器的根目录来方便我们搭建和开发网站,接下里我们将说明如 ...

  9. 如何1秒批量提取电脑文件夹中的所有文件、文件夹名字到txt/excel

    01  在工作,我们经常会遇到这样的情况,有时候我们在一个文件夹中放了很多的文件,或者是这个文件夹中有很多的子文件夹,每一个子文件夹的名字又不同,也没有什么样的规律, 02  但是我们要整理一下这个文 ...

随机推荐

  1. 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora

    本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL ...

  2. hadoop集群无法找到datanode节点问题解决

    问题:在配置hadoop集群时,master的50070后台中找不到slave的datanode节点怎么办? 解决: 方法一:首先确认下master和slave的hdfs-site.xml配置中的df ...

  3. MyBatis源码解析(五)——DataSource数据源模块之非池型数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675633.html 1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂 ...

  4. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务 ...

  5. Perl数据序列化和持久化(入门):Storable模块

    Perl提供了一个Storable模块,用来对数据结构进行序列化(serialization,Perl中称为冻结),也就是将数据结构保存为二进制数据. 序列化后的数据可以写入文件实现持久化,可以将持久 ...

  6. 快速制作gif动图

    0.环境准备 gif动画录制工具,下载后可以直接安装: 安装提示需要.net framework4.0.30319环境的话,下载一个直接安装即可 1.开始录制 安装成功界面: 开始录制: 录制效果如下 ...

  7. [转]php中 curl模拟post发送json并接收json

    本文转自:https://blog.csdn.net/pangchengyong0724/article/details/52103962 本地模拟请求服务器数据,请求数据格式为json,服务器返回数 ...

  8. [转]Cordova Android 返回键拦截(backbutton)和退出(再点击一次跳出)

    本文转自:https://blog.csdn.net/aierJun/article/details/53944061 在Android原生webview里重写onBackPressed()就可以.@ ...

  9. C#计算字符串长度,汉字算两个字符

    在C#中的字符串类String中,有个Length属性表示字符串的长度,但该字段返回的是字符的个数,如果字符串中含有中文字符的话,一个汉字占用两个字符的长度,此时获取的长度就不够精确,当然也看具体业务 ...

  10. Spring Day 2

    **Spring框架的IOC之注解方式的快速入门** 步骤一:导入注解开发所有需要的jar包 步骤二:创建对应的包结构,编写Java的类:接口到实现类 步骤三:在src的目录下,创建applicati ...