1. 程式人生 > >Oracle參數Arraysize設置對於邏輯讀的影響分析

Oracle參數Arraysize設置對於邏輯讀的影響分析

ive sta 參數 lec 完成 查看 dba ray 數據庫

說明:

當執行一條SQL查詢的時候,為了獲得滿足的數據,查詢在這個過程中完成解析,綁定,執行和提取數據等一系列步驟,這些步驟都是單獨執行的,滿足條件的數據行必須由數據庫返回給應用;對於任何大小的結果集,需要返回的數據行很可能不是在一次往返調用過程中傳遞給應用的!

每次調用過程中,數據庫與客戶端之間的往返回路數將一定層次上影響總的響應時間,其中除了提取數據(FETCH)步驟,其余步驟(解析,綁定,執行)都只執行一次,這也是必要的,Oracle需要獲得滿足查詢條件的所有數據結果從而執行多次提取操作。

關於提取操作的機制,一次FETCH調用將會訪問緩沖區緩存中的一個或多個數據塊,每次訪問一個數據塊的時候,Oracle會在該塊中取出數據行然後在一次回路中返回給客戶端,這裏對於一次返回的行數便是Arraysize(列大小),Arraysize表明了一次提取操作在網絡回路中傳輸的可能的數據行數。

分析:

Arraysize的機制我們可以得知Arraysize對於邏輯讀的一個基本的影響,如果在應用中相應的提高Arraysize的大小,相比之前的設置,每次從數據塊中獲取的行數將對應得到提高,相同行數情況下,訪問數據塊的次數自然減小,邏輯讀也就相應的降低;實際情況也是如此。

-- 查看當前的Arraysize
SQL> show arraysize 
arraysize 15
SQL> select * from dba_objects;
rows selected.

Statistics
----------------------------------------------------------
 recursive calls
 db block gets
 consistent gets
 physical reads
 redo size
 bytes sent via SQL*Net to client
 bytes received via SQL*Net from client
 SQL*Net roundtrips to/from client
 sorts (memory)
 sorts (disk)
 rows processed

-- 設置Arraysize為50
SQL> set arraysize 50
SQL> select * from dba_objects;
rows selected.

Statistics
----------------------------------------------------------
 recursive calls
 db block gets
 consistent gets
 physical reads
 redo size
 bytes sent via SQL*Net to client
 bytes received via SQL*Net from client
 SQL*Net roundtrips to/from client
 sorts (memory)
 sorts (disk)
 rows processed
SQL>

上面的測試我以SQL*Plus為例,選取了對dba_objects表訪問的查詢,SQL查詢的結果集是相同的,這時將Arraysize的值從默認的15提高至50,就看到了非常明顯的變化:

1.邏輯讀次數大幅減小,由8659減至4092。
2.網絡往返次數由之前的6611次下降到只需要1984次。

需要註意的是這些改變都是與SQL語句本身無關的,Arraysize大小需要通過編程實現,本例中使用SQL*Plus環境中的SET ARRAYSIZE命令,如果是Java應用,可以通過設置Connection.SetdefaultRowPrefetch(n)來實現。

Oracle參數Arraysize設置對於邏輯讀的影響分析