[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.
[20181108]12c sqlplus rowprefetch参数4.txt
来源:这里教程网
时间:2026-03-03 12:13:08
作者:
编辑推荐:
- word中怎么将两张图片并列03-03
- [20181108]12c sqlplus rowprefetch参数4.txt03-03
- word中如何加入背景音乐的两种方法03-03
- word中如何编辑公式的两种方法03-03
- 关于Oracle Timezone的一点总结03-03
- word中怎么将尾注和脚注互换03-03
- word中怎么微调文字03-03
- OGG-01028 Recovery record is missing from log 的BUG处理03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- HanLP用户自定义词典源码分析
HanLP用户自定义词典源码分析
26-03-03 - orecle分析函数
orecle分析函数
26-03-03 - Windows下用命令行工具ADRCI跟踪日志文件
Windows下用命令行工具ADRCI跟踪日志文件
26-03-03 - word空白页无法删除这么办
word空白页无法删除这么办
26-03-03 - 跨平台级联dataguard配置
跨平台级联dataguard配置
26-03-03 - informatic
informatic
26-03-03 - ORACLE 递归算法
ORACLE 递归算法
26-03-03 - ORACLE JOB
ORACLE JOB
26-03-03 - SQL优化案例-使用with as优化Subquery Unnesting(七)
- ORACLE数据库备份
ORACLE数据库备份
26-03-03
