[20181108]12c sqlplus rowfetch参数4.txt
[20181108]12c sqlplus rowfetch参数4.txt
--//12cR2 可以改变缺省rowfetch参数.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.
[20181108]12c sqlplus rowfetch参数4.txt的更多相关文章
- [20181109]12c sqlplus rowprefetch参数5
[20181109]12c sqlplus rowprefetch参数5.txt --//这几天一直在探究设置sqlplus参数rowprefetch与arraysize的关系,有必要做一些总结以及一 ...
- [20190417]隐含参数_SPIN_COUNT.txt
[20190417]隐含参数_SPIN_COUNT.txt--//在探究latch spin计数之前,先简单探究_SPIN_COUNT.实际上oracle现在版本latch spin的数量不再是200 ...
- [20190401]隐含参数_mutex_spin_count.txt
[20190401]隐含参数_mutex_spin_count.txt --//上午做了一些测试关于semtimedop函数调用,发现自己上个星期在一些问题上理解错误.--//相关链接:--//htt ...
- [20181031]12c 在线移动数据文件.txt
[20181031]12c 在线移动数据文件.txt --//12c以前,移动或者改名数据文件是一项比较麻烦的事情,至少要停一下业务.而12c支持在线移动或者改名数据文件,并且有点不可思议--//的是 ...
- paip.提升性能---mysql 性能 测试以及 参数调整.txt
paip.提升性能---mysql 性能 测试以及 参数调整.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://b ...
- paip.提升性能----jvm参数调整.txt
paip.提升性能----jvm参数调整.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...
- [20170604]12c Top Frequency histogram补充.txt
[20170604]12c Top Frequency histogram补充.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING ...
- [20170927]hugepages与内核参数nr_overcommit_hugepages.txt
[20170927]hugepages与内核参数nr_overcommit_hugepages.txt /proc/sys/vm/nr_overcommit_hugepages specifies h ...
- [20191206]隐含参数_db_always_check_system_ts.txt
[20191206]隐含参数_db_always_check_system_ts.txt --//今年年头我做tab$删除恢复时,遇到的问题,就是遇到延迟块清除的问题.参考链接:http://blog ...
随机推荐
- golang写业务代码,用全局函数还是成员函数
在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复 ...
- python三大神器之fabric(2.0新特性)
fabric经常出现在自动化运维领域,批量处理一些运维工作.fabric是在paramiko之上又封装了一层,操作起来更加简单易用. 本来只是想写个博客记录一下,然后发现之前写的代码不能运行了,报以下 ...
- input的三个属性autocomplete、autocapitalize和autocorrect
下面的input的三个属性是H5新增的属性 <input type="text" class="input-search" placeholder=&qu ...
- sharding:谁都能读懂的分库、分表、分区
本文通过大量图片来分析和描述分库.分表以及数据库分区是怎样进行的. 1.sharding前的初始数据分布 在本文中,我打算用高考考生相关信息作为实验数据.请无视表的字段是否符合现实,也请无视表的设计是 ...
- python装饰器2:类装饰器
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你 ...
- MDK 中 [WEAK] 的作用
简介 __weak 或 [weak] 具有相同的功能,用于定义变量或者函数,常见于定义函数,在 MDK 链接时优先链接定义为非 weak 的函数或变量,如果找不到则再链接 weak 函数. 在STM3 ...
- 关于 Cortex-M3 的双堆栈机制
CM3 的堆栈分为两个:主堆栈和进程堆栈. 那么,这两个栈分别在什么情况下使用呢? 我们看一下CM3的控制寄存器(CONTROL):控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针. CON ...
- 第一册:lesson ninety-seven。
原文: A small blue case. I left a suitcase on the train to London the other day. Can you describe it , ...
- .NET Core 实践二:事件通知和异步处理
首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到, ...
- Java_Properties
Java_Properties类 Hashtable与HashMap区别 主要:Hashtable线程安全,同步,效率相对低下 HashMap线程不安全,异步,效率高 父类:Hashtable父类是D ...