?? 通常情況下數據庫引擎每訪問一個數據塊將產生至少一個邏輯讀。而行預取與邏輯讀息息相關。行預取是指當客戶端從數據庫獲取數據時
可以采用單行也可以采用多行方式返回數據。當采用多行方式時,則會預取多條記錄存儲在客戶端內存中以避免后續多次該數據的請求所致的
各種開銷(LIO,PIO,NET IO)。一般預取行數越大,則所產生的開銷越小,當達到臨界值時其變化不大。
一、演示
二、分析
? 假定使用select * from t發布查詢,此時表上每個數據塊為16行,且arraysize 的設置為15(缺省值),
? 則
??? 第一次fetch, 讀第一塊15行,此時產生第1次consistent gets
??? 第二次fetch, 讀第一塊1行,此時產生第2次consistent gets,讀第二塊14行,此時產生第3次consistent gets
??? 第三次fetch, 讀第二塊2行,此時產生第4次consistent gets,讀第三塊13行,此時產生第5次consistent gets
???? 依此內推
? 假定此時表上每個數據塊為10行,即數據塊上的行數小于arraysize的情形(10<15)
???? 第一次fetch,讀第一塊10行,此時產生第1次consistent gets
?????????? 讀第二塊5行,此時產生第2次consistent gets
???? 第二次fetch,讀第二塊5行,此時產生第3次consistent gets
?????????? 讀第三塊10行,此時產生第4次consistent gets
???? 第三次fetch,讀第四塊10行,此時產生第5次consistent gets
?????????? 讀第五塊5行,此時產生第6次consistent gets
??? 依此內推
???
? 當arraysize設置為n(15)時,則Oracle從buffer一次fetch n(15)行,然后將數據返回給客戶端.接下來Oracle會再次從buffer中fetch第二次
? ,返回下一個n(15)行?
? 由上可知,在fetch期間可能會產生多次consistent gets。
?
? 當設置了較大的arraysize,從演示中可以看出SQL*Net的sent與received也隨之減少。即請求時往返的次數明顯降低。??
三、總結
? 1、arraysize參數用于控制返回給客戶端預取的行數,缺省值為15
? 2、邏輯讀為consistent gets + db block gets,為簡化描述,下面直接使用邏輯讀
? 3、當行預取值設定為1時,對于全表掃描,每返回一個行需要產生一個邏輯讀,如果設定的行預取值大于單塊存儲的行數,則邏輯讀接近于塊數
? 4、邏輯讀的值隨arraysize的增大而減小,當達到臨界值(即略大于表上單塊存儲的行束)之后其變化趨勢不大
? 5、SQL*Net的sent與received的值會隨著arraysize的增大而減小
? 6、邏輯讀通常會多于一次,見第二點的分析
? 7、對于聚合運算的情形(無索引),SQL引擎內部使用行預取。即每次SQL引擎訪問一個塊的時候,抽取其中的所有行。其邏輯讀接近于塊數
? 8、在使用索引的情形下,consistent gets與arraysize無關
四、更多參考?
dbms_xplan之display_cursor函數的使用
??
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
