您好,登錄后才能下訂單哦!
Oracle arraysize的研究是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
SYS@proc> desc aaa;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID1 NUMBER(38)
ID2 NUMBER(38)
ID3 NUMBER(38)
ID4 NUMBER(38)
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> drop table aaa2 purge;
Table dropped.
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>
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里邊差別更大。
看完上述內容,你們掌握Oracle arraysize的研究是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。