一,從邏輯層面來說
本節將討論oracle如何訪問資料,在物理層,oracle讀取資料的最小單位是乙個塊,oracle讀取資料的最大限制取決於作業系統和oracle對多塊讀io的限制。在
物理上來說,乙個sql語句要讀取某個記錄,必須將該記錄讀取到db cache中,然後才能從db cache中獲取,這種訪問我們一般稱為物理讀(read),如果這個資料已經存在於db cache中,那麼前台程序可以直接從db cache中讀取資料,這樣的讀取成為邏輯讀(get),如果要讀取的資料已經被修改,需要從undo中讀取前映像來獲取一致性的資料,那麼會從undo中取出前映像,和當前的資料塊一起形成乙個一致性讀塊(cr block),然後再從cr block中讀取資料,這種訪問方式稱為一致性讀(cr get)。
從邏輯上講,oracle讀取資料通過三種途徑:全表掃瞄(full table sacn,fts)、
索引掃瞄、通過rowid直接訪問。在閱讀sql執行計畫的時候,可以通過table access子句來檢視oracle訪問某個表的方法,一般來說,對於大型的表來說,如果出現table access full的提示,是需要加以重視的,一般情況下,對於大表的全表掃瞄應該是盡量避免的。下面是乙個簡單的執行計畫:
query plan
-----------------------------------------
select statement [choose] cost=1234
table access full large [:q65001] [analyzed]
檢視sql
的執行計畫的時候,最右邊的,最上面的操作是首先被執行的,上面的例子只有乙個操作,就是對錶「
large
」進行全表掃瞄。當這個步驟執行完畢後,就會將結果集返回給上面一層的語句,上面的例子就是
select statement
這個語句,一般來說
select statement
是整個執行計畫的頂層。
[choose]
表明這個
sql語句的
optimizer_goal
,在這個提示的右側是
cost
資料,如果
cost
是有實際值的,那麼說明使用了
cbo優化器,如果
cost
沒有實際值,那麼說明使用了
rbo優化器。
比如:select statement [choose] cost=
cost
只是乙個相對的值,只是優化器用來分析訪問路徑的優劣的,相同的
sql,
cost
越小的執行計畫,起執行效果越好,開銷越小。而不同的
sql,其
cost
值是沒有可比性的。
[:q65001]
指明這部分操作被採用並行查詢的方式執行,
[analyzed]
指出被訪問的物件是被分析過的。
二,物理讀是如何進行的。
乙個**可能存在多個segment中,也可能僅僅存在乙個segment的多個extent中,也可能僅僅是存在乙個extent的多個block中。
記一次sparksql讀取oracle資料優化過程
sparksql提供外接關係型資料庫的介面如下,def jdbc url string,table string,columnname string,lowerbound long,upperbound long,numpartitions int,connectionproperties prop...
oracle如何產生隨機數
oracle 如何產生乙個隨機數 dbms random 1 小數 0 1 select dbms random.value from dual 2 指定範圍內的小數 0 100 select dbms random.value 0,100 from dual 3 指定範圍內的整數 0 100 se...
如何增加Oracle連線數
oracle的連線數 sessions 與其引數檔案中的程序數 process 有關,它們的關係如下 sessions 1.1 process 5 但是我們增加process數時,往往資料庫不能啟動了。這因為我們還漏調了乙個unix系統引數 它是 etc system 中semmns,這是unix系...