1. 程式人生 > >Oracle資料庫簡單查詢的流程

Oracle資料庫簡單查詢的流程

首先看oracle的物理體系結構圖,如下


對於上圖,簡要的五點:

①Oracle由例項和資料庫組成

②例項是由一個開闢的共享記憶體區SGA(system global area)和一系列後臺程序組成的,其中SGA最主要被劃分為共享池(shared pool)、資料緩衝區(db cache)和日誌緩衝區(log buffer)三類。後臺程序包括PMONsmon,lckn,reco.ckpt,dbwr,lgwr,arch等系列程序。

③資料庫是由資料檔案、引數檔案、日誌檔案、控制檔案、歸檔日誌檔案等系列檔案組成的,其中歸檔日誌最終可能被轉移到新的儲存介質中,用於備份恢復使用。

PGA(program global area)

區,這也是一塊開闢出來的記憶體區,和SGA最明顯的差別在於,PGA不是共享記憶體,是私有不共享的,S理解為共享的首字母。使用者對資料庫發起的無論查詢還是更新的任何操作,都是在PGA先預處理,然後接下來才進入例項區域,由SGA和系列後臺程序共同完成使用者發起的請求。

PGA起到的具體作用,也就是前面說的預處理,是什麼呢?主要有三點:第一,儲存使用者連線的資訊,如會話屬性、繫結變數等,第二,儲存使用者許可權等重要資訊,當用戶程序與資料庫建立會話時,系統會將這個使用者的相關許可權查詢出來,然後儲存在這個會話區內;第三,當發起的指定需要排序的尺寸,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,是僅供當前發起使用者使用的私有記憶體空間,這個區域的具體作用有三點(上面紅色的字型)。這裡該連線只是完成了兩點,即使用者連線資訊的儲存和許可權的儲存,只要該

session不斷開連線,下次系統不用再去硬碟中讀取資料,而直接從PGA記憶體中獲取。

此外該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的資料檔案區去查詢要的東西(當然必須用索引讀的方式查詢),如果查到了,就帶回資料緩衝區府,並由欽差大臣展現給皇上,如果找不到,也只有就此覆命。