說明:數據庫
當執行一條SQL查詢的時候,爲了得到知足的數據,查詢在這個過程當中完成解析,綁定,執行和提取數據等一系列步驟,這些步驟都是單獨執行的,知足條件的數據行必須由數據庫返回給應用;對於任何大小的結果集,須要返回的數據行極可能不是在一次往返調用過程當中傳遞給應用的!編程
每次調用過程當中,數據庫與客戶端之間的往返回路數將必定層次上影響總的響應時間,其中除了提取數據(FETCH)步驟,其他步驟(解析,綁定,執行)都只執行一次,這也是必要的,Oracle須要得到知足查詢條件的全部數據結果從而執行屢次提取操做。緩存
關於提取操做的機制,一次FETCH調用將會訪問緩衝區緩存中的一個或多個數據塊,每次訪問一個數據塊的時候,Oracle會在該塊中取出數據行而後在一次迴路中返回給客戶端,這裏對於一次返回的行數即是Arraysize(列大小),Arraysize代表了一次提取操做在網絡迴路中傳輸的可能的數據行數。網絡
分析:測試
Arraysize的機制咱們能夠得知Arraysize對於邏輯讀的一個基本的影響,若是在應用中相應的提升Arraysize的大小,相比以前的設置,每次從數據塊中獲取的行數將對應獲得提升,相同行數狀況下,訪問數據塊的次數天然減少,邏輯讀也就相應的下降;實際狀況也是如此。fetch
-- 查看當前的Arraysize
SQL> show arraysize
arraysize 15
SQL> select * from dba_objects;
99150 rows selected.spa
Statistics
----------------------------------------------------------
15 recursive calls
0 db block gets
8659 consistent gets
289 physical reads
0 redo size
5230720 bytes sent via SQL*Net to client
73219 bytes received via SQL*Net from client
6611 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
99150 rows processedcode
-- 設置Arraysize爲50
SQL> set arraysize 50
SQL> select * from dba_objects;
99150 rows selected.blog
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4092 consistent gets
1 physical reads
0 redo size
4383979 bytes sent via SQL*Net to client
22322 bytes received via SQL*Net from client
1984 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
99150 rows processed
SQL>ip
上面的測試我以SQL*Plus爲例,選取了對dba_objects表訪問的查詢,SQL查詢的結果集是相同的,這時將Arraysize的值從默認的15提升至50,就看到了很是明顯的變化:
1.邏輯讀次數大幅減少,由8659減至4092。
2.網絡往返次數由以前的6611次降低到只須要1984次。
須要注意的是這些改變都是與SQL語句自己無關的,Arraysize大小須要經過編程實現,本例中使用SQL*Plus環境中的SET ARRAYSIZE命令,若是是Java應用,能夠經過設置Connection.SetdefaultRowPrefetch(n)來實現。