Oracle Arraysize設置對于邏輯讀的影響實例分析
當執(zhí)行一條SQL查詢的時候,為了獲得滿足的數(shù)據(jù),查詢在這個過程中完成解析,綁定,執(zhí)行和提取數(shù)據(jù)等一系列步驟,這些步驟都是單獨執(zhí)行的,滿足條件的數(shù)據(jù)行必須由數(shù)據(jù)庫返回給應用;對于任何大小的結(jié)果集,需要返回的數(shù)據(jù)行很可能不是在一次往返調(diào)用過程中傳遞給應用的!
每次調(diào)用過程中,數(shù)據(jù)庫與客戶端之間的往返回路數(shù)將一定層次上影響總的響應時間,其中除了提取數(shù)據(jù)(FETCH)步驟,其余步驟(解析,綁定,執(zhí)行)都只執(zhí)行一次,這也是必要的,Oracle需要獲得滿足查詢條件的所有數(shù)據(jù)結(jié)果從而執(zhí)行多次提取操作。
關于提取操作的機制,一次FETCH調(diào)用將會訪問緩沖區(qū)緩存中的一個或多個數(shù)據(jù)塊,每次訪問一個數(shù)據(jù)塊的時候,Oracle會在該塊中取出數(shù)據(jù)行然后在一次回路中返回給客戶端,這里對于一次返回的行數(shù)便是Arraysize(列大小),Arraysize表明了一次提取操作在網(wǎng)絡回路中傳輸?shù)目赡艿臄?shù)據(jù)行數(shù)。
分析Arraysize的機制我們可以得知Arraysize對于邏輯讀的一個基本的影響,如果在應用中相應的提高Arraysize的大小,相比之前的設置,每次從數(shù)據(jù)塊中獲取的行數(shù)將對應得到提高,相同行數(shù)情況下,訪問數(shù)據(jù)塊的次數(shù)自然減小,邏輯讀也就相應的降低;實際情況也是如此。
-- 查看當前的Arraysize SQL> show arraysize arraysize 15 SQL> set autotrace traceonly statistics SQL> select * from dba_objects; 72457 rows selected. Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 7675 consistent gets 5 physical reads 0 redo size 3463453 bytes sent via SQL*Net to client 53549 bytes received via SQL*Net from client 4832 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 72457 rows processed -- 設置Arraysize為50 SQL> set arraysize 50 SQL> / 72457 rows selected. Statistics ---------------------------------------------------------- 15 recursive calls 0 db block gets 3618 consistent gets 0 physical reads 0 redo size 3034066 bytes sent via SQL*Net to client 16358 bytes received via SQL*Net from client 1451 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 72457 rows processed
上面的測試我以SQL*Plus為例,選取了對dba_objects表訪問的查詢,SQL查詢的結(jié)果集是相同的,這時將Arraysize的值從默認的15提高至50,就看到了非常明顯的變化:
1.邏輯讀次數(shù)大幅減小,由7675減至3618。
2.網(wǎng)絡往返次數(shù)由之前的4832次下降到只需要1451次。
需要注意的是這些改變都是與SQL語句本身無關的,Arraysize大小需要通過編程實現(xiàn),本例中使用SQL*Plus環(huán)境中的SET ARRAYSIZE命令,如果是Java應用,可以通過設置Connection.SetdefaultRowPrefetch(n)來實現(xiàn)。
相關文章
Oracle11.2.0.1如何升級到11.2.0.3 Oracle同版本升級
這篇文章主要為大家詳細介紹了Oracle11.2.0.1如何升級到11.2.0.3的過程,Oracle同版本升級的方法,感興趣的小伙伴們可以參考一下2016-07-07Oracle數(shù)據(jù)庫中建立索引的基本方法講解
這篇文章主要介紹了Oracle數(shù)據(jù)庫中建立索引的基本方法,包括對性能方面進行衡量而給出的一些索引的設計和使用建議,需要的朋友可以參考下2016-01-01Oracle插入日期數(shù)據(jù)常見的2個問題和解決方法
這篇文章主要介紹了Oracle插入日期數(shù)據(jù)常見的2個問題和解決方法,一個是提示無效的月份問題,一個是日期插入格式問題 ,需要的朋友可以參考下2014-07-07