sql語句執行過程小結

next_junction發表於2014-01-26
sql語句執行過程
    客戶端程式連線到db
我的測試是:當伺服器監聽是啟動狀態的時候,遠端客戶端可以連到mount狀態和open狀態的db,當db在nomount狀態時候檢視監聽的狀
態會發現已經有服務註冊了,但是遠端客戶端連線會報錯為:ora-12528:TNS:監聽程式:所有的例程都無法建立連線
    db分配一個伺服器程式service process來和user process通訊。
對於專用伺服器方式下的每一個user process伺服器端都會產生一個server process負責進行通訊,至於共享伺服器模式,db會維護少量的伺服器程式以排程程式呼叫伺服器程式來處理客戶端請求。
    對於server process來執行客戶端發出的sql語句而不是由instance的後臺程式來執行sql語句,原因應該是對於少量使用者和小併發的環境來說也許 oracle可以維護相關的後臺程式來處理sql語句,但是使用者量和併發性的問題會導致這種由後臺程式處理sql語句的方式面對一個瓶頸,而由 server process來處理的話會很好的避免這個瓶頸(dba的思想天空)。(對於dml,ddl,dcl等語句也是由server process產生redo日誌寫到redo log buffer中,而後快取中的日誌是由lgwr程式寫到聯機重做日誌檔案中的)。
    如果沒有在shared pool的library cache中找到相同的執行計劃則會進行硬解析。找到相同的執行計劃則為軟解析,相對於硬解析來說軟解析也需要進行語法,語義和物件許可權等進行檢視,只是不需要再生成執行計劃。
    如果在db buffer cache中找不到相關資料,則由server process負責從磁碟上的dbf檔案(想起我大學的dnf練到剛剛覺醒的狂戰了)中讀資料--物理讀(會發生物理i/o),而dbwn程式則是負責從 db buffer cache中向dbf檔案上寫資料。如果在db buffer cache中找到資料則屬於邏輯讀(進行邏輯i/o)。
    關於邏輯i/o(記憶體讀l) 和 物理i/o(物理讀p),sql的命中率是l/l+p(邏輯讀比邏輯讀+物理讀)。命中率低是一定有問題,但是命中率高不一定沒有問題,要關心的是每秒的物理讀和邏輯讀。(vmstat和iostat是檢視狀態的兩個命令)。(簡略,待續...)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29117696/viewspace-1075585/,如需轉載,請註明出處,否則將追究法律責任。

相關文章