Oracle資料庫簡單查詢的流程
首先看oracle的物理體系結構圖,如下
對於上圖,簡要的五點:
①Oracle由例項和資料庫組成
②例項是由一個開闢的共享記憶體區SGA(system global area)和一系列後臺程序組成的,其中SGA最主要被劃分為共享池(shared pool)、資料緩衝區(db cache)和日誌緩衝區(log buffer)三類。後臺程序包括PMON、smon,lckn,reco.ckpt,dbwr,lgwr,arch等系列程序。
③資料庫是由資料檔案、引數檔案、日誌檔案、控制檔案、歸檔日誌檔案等系列檔案組成的,其中歸檔日誌最終可能被轉移到新的儲存介質中,用於備份恢復使用。
④PGA(program global area)
PGA起到的具體作用,也就是前面說的預處理,是什麼呢?主要有三點:第一,儲存使用者連線的資訊,如會話屬性、繫結變數等,第二,儲存使用者許可權等重要資訊,當用戶程序與資料庫建立會話時,系統會將這個使用者的相關許可權查詢出來,然後儲存在這個會話區內;第三,當發起的指定需要排序的尺寸,PGA正是這個排序區,如果在記憶體中可以放下排序的尺寸,就在記憶體
⑤1區圓形虛線框,2區直角方形虛線框,3區圓角方形虛線框。使用者請求發起經歷的順序一般如下:1---》2-----》3;或者1-----》2.
Oracle的體系架構
先看一條最簡單的SQL查詢語句select object_name from t where object_id=29;當發出這個指令後,該SQL先從1區先準備工作。
前面我們向大家描述PGA不同於SGA,是僅供當前發起使用者使用的私有記憶體空間,這個區域的具體作用有三點(上面紅色的字型)。這裡該連線只是完成了兩點,即使用者連線資訊的儲存和許可權的儲存,只要該
此外該SQL還會立即匹配一條唯一的HASH值,接下來該SQL指定進入2區進行處理,首先敲開SGA區共享池的大門,準備登門拜訪。
共享池的大門打開了,該SQL先在房內查詢是否在什麼地方有儲存過這個SQL指令的身份證(就是那個唯一的hash值),如果沒有,那就要首先查詢自己的語句語法是否正確(比如from是否寫成了form)、語義是否正確(比如id欄位根本就不存在)、是否有許可權,在這些都沒有問題的情況下生成這條語句的身份證,唯一的hash值就被儲存下來了。接下來就開始進行解析,解析什麼呢?比如select object_name from t where object_id=29 這個語句,在object_id列有索引的情況下,使用索引更高效,還是全表掃描更高效?Oracle要做出選擇。
假設oracle認定使用索引代價(COST)更低,於是oracle就選用索引讀的執行計劃而放棄了全表掃描方式。接下來這個索引讀的計劃就立即被儲存起來,並且和之前儲存的該SQL的身份證(唯一HASH)值對應在一起。
接下來,該SQL指令好比欽差大臣一樣,手持”索引讀獲取某某資料”這個聖旨,繼續往前走,去哪兒呢?原來是直奔”資料緩衝區”。
資料緩衝區開門迎接後,立即要根據ID列上的索引從t表中查詢object_id值為29的寶物,但是所要的東西在府內找不到,該怎麼辦?資料緩衝區只好傳令下去,去偏遠的Database的資料檔案區去查詢要的東西(當然必須用索引讀的方式查詢),如果查到了,就帶回資料緩衝區府,並由欽差大臣展現給皇上,如果找不到,也只有就此覆命。