zoukankan      html  css  js  c++  java
  • 【Oracle】arraysize的研究(存在疑问)

    arraysize的研究(存在疑问)

    SYS@proc> create table aaa (id1 int,id2 int,id3 int,id4 int);
    
    Table created.
    
    SYS@proc> create table aaa1 (id1 int,id2 int,id3 int,id4 int);
    
    Table created.
    
    SYS@proc> insert into aaa values (1,1,1,1);
    
    1 row created.
    
    SYS@proc> insert into aaa values (1,1,1,0);
    
    1 row created.
    
    SYS@proc> commit;
    
    Commit complete.
    
    SYS@proc> insert into aaa1 values (1,1,1,0);
    
    1 row created.
    
    SYS@proc> insert into aaa1 values (1,1,1,1);
    
    1 row created.
    
    SYS@proc> commit;
    
    Commit complete.
    
    SYS@proc> select * from aaa;
    
           ID1        ID2        ID3        ID4
    ---------- ---------- ---------- ----------
             1          1          1          1
             1          1          1          0
    
    SYS@proc> select * from aaa1;
    
           ID1        ID2        ID3        ID4
    ---------- ---------- ---------- ----------
             1          1          1          0
             1          1          1          1
    
    SYS@proc> select * from aaa where id1/id2=1 and id3/id4=1;
    ERROR:
    ORA-01476: divisor is equal to zero
    
    
    
    no rows selected
    
    SYS@proc> set arraysize 1 
    SYS@proc> /
    
           ID1        ID2        ID3        ID4
    ---------- ---------- ---------- ----------
             1          1          1          1
    ERROR:
    ORA-01476: divisor is equal to zero
    
    
    
    SYS@proc> select * from aaa1 where id1/id2=1 and id3/id4=1;
    select * from aaa1 where id1/id2=1 and id3/id4=1
                                              *
    ERROR at line 1:
    ORA-01476: divisor is equal to zero
    
    
    SYS@proc> create table aaa2 (id1 int,id2 int,id3 int,id4 int,flag int);
    
    Table created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,1);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,2);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,3);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,4);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,5);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,6);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,7);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,8);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,9);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,1,10);
    
    1 row created.
    
    SYS@proc> insert into aaa2 values(1,1,1,0,0);
    
    1 row created.
    
    SYS@proc> commit;
    
    Commit complete.
    
    SYS@proc> analyze table aaa2 compute statistics;
    
    Table analyzed.
    
    SYS@proc> set arraysize 1
    SYS@proc> select * from aaa2 where id1/id2=1 and id3/id4=1;
    
           ID1        ID2        ID3        ID4       FLAG
    ---------- ---------- ---------- ---------- ----------
             1          1          1          1          1
             1          1          1          1          2
             1          1          1          1          3
             1          1          1          1          4
             1          1          1          1          5
             1          1          1          1          6
             1          1          1          1          7
             1          1          1          1          8
             1          1          1          1          9
    ERROR:
    ORA-01476: divisor is equal to zero
    
    
    
    9 rows selected.
    

    –从大量结果上看,arraysize为1或者2是一样的。这里为9预见。

    SYS@proc> select * from aaa2;
    
           ID1        ID2        ID3        ID4       FLAG
    ---------- ---------- ---------- ---------- ----------
             1          1          1          1          1
             1          1          1          1          2
             1          1          1          1          3
             1          1          1          1          4
             1          1          1          1          5
             1          1          1          1          6
             1          1          1          1          7
             1          1          1          1          8
             1          1          1          1          9
             1          1          1          1         10
             1          1          1          0          0
    
    11 rows selected.
    
    SYS@proc> set arraysize 2
    SYS@proc> select * from aaa2 where id1/id2=1 and id3/id4=1;
    
           ID1        ID2        ID3        ID4       FLAG
    ---------- ---------- ---------- ---------- ----------
             1          1          1          1          1
             1          1          1          1          2
             1          1          1          1          3
             1          1          1          1          4
             1          1          1          1          5
             1          1          1          1          6
             1          1          1          1          7
             1          1          1          1          8
    ERROR:
    ORA-01476: divisor is equal to zero
    
    
    
    8 rows selected.
    

    语句对应的10046,可以看出是返回了9行,但是从上边看是8行,很奇怪。

    PARSING IN CURSOR #140496887317072 len=48 dep=0 uid=0 oct=3 lid=0 tim=1514130832420098 hv=3007681721 ad='812bd000' sqlid='7cfwyuytnb55t'
    select * from aaa2 where id1/id2=1 and id3/id4=1
    END OF STMT
    PARSE #140496887317072:c=0,e=1221,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=2576342259,tim=1514130832420093
    EXEC #140496887317072:c=0,e=24,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=2576342259,tim=1514130832420198
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 5 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832420238
    FETCH #140496887317072:c=0,e=64,p=0,cr=2,cu=0,mis=0,r=1,dep=0,og=1,plh=2576342259,tim=1514130832420331
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 476 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832420842
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832420907
    FETCH #140496887317072:c=0,e=36,p=0,cr=1,cu=0,mis=0,r=2,dep=0,og=1,plh=2576342259,tim=1514130832420924
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 146 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421092
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421137
    FETCH #140496887317072:c=0,e=28,p=0,cr=1,cu=0,mis=0,r=2,dep=0,og=1,plh=2576342259,tim=1514130832421151
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 66 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421237
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421277
    FETCH #140496887317072:c=0,e=26,p=0,cr=1,cu=0,mis=0,r=2,dep=0,og=1,plh=2576342259,tim=1514130832421290
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 60 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421369
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421407
    FETCH #140496887317072:c=0,e=25,p=0,cr=1,cu=0,mis=0,r=2,dep=0,og=1,plh=2576342259,tim=1514130832421420
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 410 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421848
    WAIT #140496887317072: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832421907
    FETCH #140496887317072:c=0,e=63,p=0,cr=1,cu=0,mis=0,r=1,dep=0,og=1,plh=2576342259,tim=1514130832421956
    STAT #140496887317072 id=1 cnt=10 pid=0 pos=1 obj=88977 op='TABLE ACCESS FULL AAA2 (cr=7 pr=0 pw=0 time=94 us cost=2 size=10 card=1)'
    WAIT #140496887317072: nam='SQL*Net break/reset to client' ela= 28 driver id=1650815232 break?=1 p3=0 obj#=-1 tim=1514130832422110
    WAIT #140496887317072: nam='SQL*Net break/reset to client' ela= 120 driver id=1650815232 break?=0 p3=0 obj#=-1 tim=1514130832422252
    WAIT #140496887317072: nam='SQL*Net message from client' ela= 595 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1514130832422889
    CLOSE #140496887317072:c=0,e=14,dep=0,type=0,tim=1514130832422981
    
    =====================
    

    所以其实arraysize是1还是2,还是存在区别的。不过从10046上看却是没多大区别,从全表扫描或者其他能够正常返回结果的情况下,值为1和2是完全一样的。

    但是实际上无论arraysize的值是多少,默认第一行单独会直接发送反馈给用户的,所以应该是不用设置的。
    后边研究的逻辑读也有点问题,在12C里边差别更大。
    其他:arraysize对逻辑读的影响

  • 相关阅读:
    Tomcat6 一些调优设置内存和连接数
    【原创】使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException
    JVM内存的设置
    JBOSS以及tomcat最大连接数配置和jvm内存配置
    摘抄python __init__
    Python中__init__方法介绍
    Python 绝对简明手册
    python中eval, exec, execfile,和compile [转载]
    extern、static、auto、register 定义变量的不同用法
    Python 网络编程说明
  • 原文地址:https://www.cnblogs.com/PiscesCanon/p/12723512.html
Copyright © 2011-2022 走看看