通常情況下資料庫引擎每訪問乙個資料塊將產生至少乙個邏輯讀。而行預取與邏輯讀息息相關。行預取是指當客戶端從資料庫獲取資料時
可以採用單行也可以採用多行方式返回資料。當採用多行方式時,則會預取多條記錄儲存在客戶端記憶體中以避免後續多次該資料的請求所致的
各種開銷(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函式的使用
dbms_xplan之display函式的使用
執行計畫中各字段各模組描述
使用 explain plan 獲取sql語句執行計畫
啟用 autotrace 功能
函式使得索引列失效
oracle 繫結變數窺探
oracle 自適應共享游標
RabbitMQ basicQos預取方法引數解析
乙個引數 channel.basicqos 1 basicqos int prefetchcount 兩個引數 channel.basicqos 3,false basicqos int prefetchcount,boolean global 三個引數 channel.basicqos 0,3,f...
「預取址」與「突發傳輸」的概念
預取址 在一些應用中我們會遇到 可預取 記憶體的概念,可預取性是指儲存器空間的可預取能力。如果讀操作沒有 即如同從 ram 中讀資料一樣不會破壞資料 則稱儲存器空間可預取。必要時可將位元組寫操作合併成乙個雙字寫操作。可預取是讀取一次以後不會改變讀取位址和儲存狀態的任何改變,cpu 可快取它的內容並且...
取上下行資料分析函式lag 和lead
語法 lag expr,lead expr,功能 表示根據col1分組,在分組內部根據 col2排序,而這個值就表示每組內部排序後的順序編號 組內連續的唯一的 lead 下乙個值 lag 上乙個值 引數 expr是從其他行返回的表示式 offset是預設為1 的正數,表示相對行數。希望檢索的當前行分...