[20181108]12c sqlplus rowprefetch参数4.txt

[20181108]12c sqlplus rowprefetch参数4.txt


--//12cR2 可以改变缺省rowprefetch参数.11g之前缺省是1.通过一些测试说明问题.

--//前几天做的测试有点乱,链接http://blog.itpub.net/267265/viewspace-2219004/.

--//重新梳理看看.


1.环境:

SCOTT@78> @ver1

PORT_STRING                    VERSION        BANNER

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

x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//数据库11.2.0.4.但是我使用12c sqlplus做为客户端,rowprefetch参数可以设置,测试一样有效.


SCOTT@78>create table t as select rownum id1,1 id2 from dual connect by level<=23;

Table created.


SCOTT@78> show rowprefetch

rowprefetch 1

--//可以发现缺省就是1.11g之前无法设置.

--//另外rowprefetch不能设置为0.

SCOTT@78> set rowprefetch 0

SP2-0267: rowprefetch option 0 out of range (1 through 32767)


grant EXECUTE ON  dbms_lock to scott;


CREATE OR REPLACE FUNCTION SCOTT.sleep (seconds IN NUMBER)

   RETURN NUMBER

AS

BEGIN

   sys.DBMS_LOCK.sleep (seconds);

   RETURN seconds;

END;

/


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;

/


2.建立测试脚本:

R:> cat aa.txt

set timing on

set arraysize &1

set rowprefetch &2

alter session set events '10046 trace name context forever, level 12';

select rownum  ,t.*,sleep(id2) n10,&&1 arraysize ,&&2 rowprefetch from t;

--select rownum  ,emp.*,get_dept(deptno) c10,&&1 arraysize ,&&2 rowprefetch from emp;

alter session set events '10046 trace name context off';

set timing off


--//执行脚本时,第1个参数表示arraysize,第2个参数表示rowprefetch.


3.测试:

SCOTT@78> @ aa.txt 5 4

    ROWNUM        ID1        ID2  N10  ARRAYSIZE ROWPREFETCH

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

         1          1          1    1          5           4

         2          2          1    1          5           4

         3          3          1    1          5           4

         4          4          1    1          5           4

         5          5          1    1          5           4

         6          6          1    1          5           4

         7          7          1    1          5           4

         8          8          1    1          5           4

         9          9          1    1          5           4

        10         10          1    1          5           4

        11         11          1    1          5           4

        12         12          1    1          5           4

        13         13          1    1          5           4

        14         14          1    1          5           4

        15         15          1    1          5           4

        16         16          1    1          5           4

        17         17          1    1          5           4

        18         18          1    1          5           4

        19         19          1    1          5           4

        20         20          1    1          5           4

        21         21          1    1          5           4

        22         22          1    1          5           4

        23         23          1    1          5           4

23 rows selected.


FETCH #140079390128648:c=1000,e=4004469,p=0,cr=3,cu=0,mis=0,r=4,dep=0,og=1,plh=2402761124,tim=1541647376650608

FETCH #140079390128648:c=1000,e=5004986,p=0,cr=1,cu=0,mis=0,r=5,dep=0,og=1,plh=2402761124,tim=1541647381656601

FETCH #140079390128648:c=999,e=5005185,p=0,cr=1,cu=0,mis=0,r=5,dep=0,og=1,plh=2402761124,tim=1541647386662564

FETCH #140079390128648:c=1000,e=5005145,p=0,cr=1,cu=0,mis=0,r=5,dep=0,og=1,plh=2402761124,tim=1541647391668598

FETCH #140079390128648:c=1000,e=4004133,p=0,cr=1,cu=0,mis=0,r=4,dep=0,og=1,plh=2402761124,tim=1541647395673629


--//fetch 4,5,5,5,4. 而显示行数5,5,5,8.

--//你可以发现在输出前等待至少9秒(我使用手机秒表测试).也就是在输出前已经fetch 9条记录.

--//可以理解为 先fetch=4(rowprefetch=4),不足arraysize=5,再fetch=5.必须等fetch完成了(这时已经过了9秒),才会显示输出5条,

--//剩余4条在输出缓存(不足),再fetch=5,显示输出5条.剩余4条在输出缓存.再fetch=5,显示输出5条,剩余4条在输出缓存,这时再

--//fetch=4仅仅剩下4条记录,这时已经fetch完成,缓存的8条一起输出,不再按照5条输出.


SCOTT@78> @ aa.txt 5 9

...

--//结果不再贴出略.


FETCH #140079394727376:c=2000,e=9009422,p=0,cr=3,cu=0,mis=0,r=9,dep=0,og=1,plh=2402761124,tim=1541649678068572

FETCH #140079394727376:c=1000,e=10009690,p=0,cr=1,cu=0,mis=0,r=10,dep=0,og=1,plh=2402761124,tim=1541649688079548

FETCH #140079394727376:c=0,e=4003868,p=0,cr=1,cu=0,mis=0,r=4,dep=0,og=1,plh=2402761124,tim=1541649692084551


--//fetch 9,10,4. 而显示行数5,10,8.

--//你可以发现第2次fetch不再等于arraysize,而是2*arraysize.


SCOTT@78> @ aa.txt 6 11

..

--//结果不再贴出略.


FETCH #140079389953128:c=2000,e=11010343,p=0,cr=3,cu=0,mis=0,r=11,dep=0,og=1,plh=2402761124,tim=1541660682428524

FETCH #140079389953128:c=2000,e=12011616,p=0,cr=1,cu=0,mis=0,r=12,dep=0,og=1,plh=2402761124,tim=1541660694441553

FETCH #140079389953128:c=0,e=14,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2402761124,tim=1541660694442817


--//fetch 11,12,1. 而显示行数6,17

--//你可以发现第2次fetch不再等于arraysize,而是2*arraysize.

--//注:最后1次fetch r=0,很快,所以看到第2次显示17,实际上显示行数还是6,12,5.


SCOTT@78> @ aa.txt 3 7

..

--//结果不再贴出略.

FETCH #140079389953128:c=2000,e=7006724,p=0,cr=3,cu=0,mis=0,r=7,dep=0,og=1,plh=2402761124,tim=1541660899414555

FETCH #140079389953128:c=2000,e=9008694,p=0,cr=1,cu=0,mis=0,r=9,dep=0,og=1,plh=2402761124,tim=1541660908424586

FETCH #140079389953128:c=999,e=7006930,p=0,cr=1,cu=0,mis=0,r=7,dep=0,og=1,plh=2402761124,tim=1541660915432531


--//fetch 7,9,7. 而显示行数6,9,8

--//你可以发现第2次fetch不再等于arraysize,而是3*arraysize.


SCOTT@78> @ aa.txt 2 7

...

--//结果不再贴出略.


FETCH #140079390530944:c=1000,e=7007159,p=0,cr=3,cu=0,mis=0,r=7,dep=0,og=1,plh=2402761124,tim=1541661275532542

FETCH #140079390530944:c=1000,e=8007723,p=0,cr=1,cu=0,mis=0,r=8,dep=0,og=1,plh=2402761124,tim=1541661283541636

FETCH #140079390530944:c=2000,e=8007970,p=0,cr=1,cu=0,mis=0,r=8,dep=0,og=1,plh=2402761124,tim=1541661291550622

FETCH #140079390530944:c=0,e=19,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2402761124,tim=1541661291551655


--//fetch 7,8,8,0. 而显示行数6,8,9.

--//你可以发现第2次fetch不再等于arraysize,而是4*arraysize.

--//再次出现最后一次fetch r=0的情况,实际上显示行数是6,8,8,1. 


--//这样可以得到一个规律:


--//你可以发现第2次fetch不再等于arraysize,而是N*arraysize.第2次fetch参数应该是 ceil(rowprefetch/arraysize)*arraysize.


3.小结:

--//可以看出一些规律:

--//1.fetch 第1次数量与参数rowprefetch相关,当然必须小于返回记录的数量.

--//2.fetch 第X次数量(X>=2)与参数arraysize的倍数N有关. N=ceil(rowprefetch/arraysize)

--//3.fetch 最后一次应该等于剩余记录.不会大于ceil(rowprefetch/arraysize)*arraysize.

--//4.fetch 最后一次有可能是0. 


--//5.显示行数 第1次 floor(rowprefetch/arraysize)*arraysize.

--//6.显示行数 第X次(X>=2) ceil(rowprefetch/arraysize)*arraysize.

--//7.显示行数 最后一次等于剩余在缓存的行数. 


--//这样链接中http://blog.itpub.net/267265/viewspace-2219004/.看到的情况就很好解析了.


--//实际上这其中细节不重要,你可以理解改变12c下改变sqlplus的rowprefetch参数,有可能隐含改变了fetch方式.

--//第1次fetch = rowpefetch, 第2次 fetch 等于 ceil(rowprefetch/arraysize)*arraysize就足够了.


--//最后再分析前面测试我遇到的一个问题.实际上某种巧合.最后一次fetch r=0导致的情况.

set arraysize 5

set rowprefetch 4

@ 10046on 12

select rownum  ,emp.*,get_dept(deptno) c10,5 arraysize ,4 rowprefetch from emp;

@ 10046off


FETCH #140079390567504:c=1000,e=2002160,p=0,cr=10,cu=0,mis=0,r=4,dep=0,og=1,plh=1498225739,tim=1541661929029851

FETCH #140079390567504:c=1000,e=3002851,p=0,cr=7,cu=0,mis=0,r=5,dep=0,og=1,plh=1498225739,tim=1541661932033872

FETCH #140079390567504:c=2000,e=3002868,p=0,cr=7,cu=0,mis=0,r=5,dep=0,og=1,plh=1498225739,tim=1541661935037842

FETCH #140079390567504:c=0,e=15,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1498225739,tim=1541661935038827


--//fetch 4,5,5,0 而显示行数5,9.我当时的疑问是为什么显示行数不是5,5,4.

--//为什么最后9行全部一次显示出来.实际上问题在第4次fetch=0,第4次fetch就很快,这样看到的显示行数就是5,9.

--//实际上就是5,5,4.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2219260/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/267265/viewspace-2219260/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《REDHAT7.0 ORACLE 12C RAC完整部署手册.pdf》是一本关于在 Redhat 7.0 系统上部署 Oracle 12c RAC(Real Application Clusters)的完整手册。RAC是一种基于集群的数据库架构,可以为企业提供高可用性和可扩展性。以下是这本手册的内容概述: 第一部分介绍了 Redhat 7.0 系统的安装和配置步骤。它提供了详细的操作指南,包括如何创建分区、安装操作系统软件和配置网络设置等。 第二部分涵盖了 Oracle 12c 数据库软件的安装和配置。手册将引导读者完成数据库软件的下载、解压缩和安装过程,并提供了必要的参数配置和环境设置。 第三部分详细介绍了如何配置 Oracle 12c RAC。它包括创建共享存储、配置集群网络、设置监听器以及配置虚拟 IP 等操作。手册还提供了图文并茂的步骤指南和示例命令,帮助读者顺利完成配置过程。 第四部分涉及了备份和恢复策略。它讨论了使用 RMAN(Recovery Manager)进行备份和恢复的方法,并介绍了如何创建并维护备份集和恢复目录等。 最后一部分是对常见问题和故障排除的汇总。手册列举了一些可能出现的错误信息和解决方法,帮助读者在部署过程中遇到问题时能够及时解决。 总体而言,《REDHAT7.0 ORACLE 12C RAC完整部署手册.pdf》提供了全面的部署指南,是一本帮助读者在 Redhat 7.0 系统上成功部署 Oracle 12c RAC 的实用手册。无论是对于初学者还是有经验的管理员来说,这本手册都是一个有价值的参考资料。 ### 回答2: 《Red Hat 7.0 Oracle 12c RAC完整部署手册.pdf》是一本关于在Red Hat 7.0操作系统上部署Oracle 12c RAC(Real Application Cluster)的详细手册。这本手册提供了从安装操作系统到配置Oracle数据库集群的完整步骤和指导。 Red Hat 7.0是一种企业级Linux操作系统,特别适合于构建高可用性解决方案。Oracle 12c RAC是一种通过将多个服务器组成数据库集群来提高数据库性能和可靠性的技术。 这本手册首先介绍了在Red Hat 7.0上安装和配置必要的软件和服务,包括启用并配置网络接口、配置存储和文件系统、安装并配置Oracle Linux的依赖软件和工具等。 接下来,手册详细介绍了如何安装和配置Oracle Grid Infrastructure,这是Oracle RAC的基础架构。它包括了创建和配置ASM(Automatic Storage Management)磁盘组、创建网络资源、配置集群软件等步骤。 然后,手册详细描述了如何安装和配置Oracle数据库软件。这包括创建和配置Oracle数据库实例、创建和配置监听器、配置TNS(Transparent Network Substrate)解析等步骤。 最后,手册展示了如何创建和配置Oracle RAC数据库。它涵盖了创建数据库、配置OCR(Oracle Cluster Registry)和配置VIP(Virtual IP)等关键步骤。 这本手册非常详细,提供了每个步骤的详细说明和截图,使读者能够准确地按照指导完成部署。对于想要在Red Hat 7.0上安装和配置Oracle 12c RAC的用户来说,这本手册是一本非常有价值的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值