[20181109]12c sqlplus rowprefetch参数5

[20181109]12c sqlplus rowprefetch参数5.txt

–//这几天一直在探究设置sqlplus参数rowprefetch与arraysize的关系,有必要做一些总结以及一些小更正:

1.设置rowprefetch < arraysize 的情况最佳,因为这样fetch的模式是
rowprefetch,arraysize,arraysize,,…,剩下的记录.
–//比较符合需要的情况.

2.不建议设置rowprefetch >= arraysize的情况.因为这样改变fetch的模式.

rowprefetch,(floor(rowprefetch/arraysize)+1)*arraysize,(floor(rowprefetch/arraysize)+1)*arraysize,…,剩下的记录.

3.补充一点做1点点小小的更正.
–//计算公式不是ceil(rowprefetch/arraysize)*arraysize,而是(floor(rowprefetch/arraysize)+1)*arraysize.
–//这样对于rowprefetch < arraysize该公式也适用.

4.补充例子说明:
–//测试 rowprefetch = arraysize的情况
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.

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;
/

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.

scott@78> @ aa.txt 5 5
session altered.

$ grep fetch /u01/app/oracle/diag/rdbms/book/book/trace/book_ora_22631.trc | grep plh=2402761124
fetch #140395096751240:c=0,e=5005000,p=0,cr=3,cu=0,mis=0,r=5,dep=0,og=1,plh=2402761124,tim=1541729295424586
fetch #140395096751240:c=2000,e=10010448,p=0,cr=1,cu=0,mis=0,r=10,dep=0,og=1,plh=2402761124,tim=1541729305494803
fetch #140395096751240:c=1000,e=8007876,p=0,cr=1,cu=0,mis=0,r=8,dep=0,og=1,plh=2402761124,tim=1541729313586610

–//fetch 5,10,8. 而显示行数5,10,8.
–//也就是rowprefetch=arraysize,第2次fetch是 2*arraysize.
–//这样上面的公式也满足要求.(floor(rowprefetch/arraysize)+1)*arraysize

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐