sql執行過程分析

yufeng0471發表於2011-04-18

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果瞭解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助

首先了解一下執行sql,需要消耗什麼資源,
cpu,
記憶體,
io,

我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,什麼情況下消耗io,只有瞭解了這些,我們才能
有針對性的優化,如果oracle的瓶頸在記憶體上,就要通過一定的手段(可以檢視awr報告,也可以直接查詢oracle統計表)去找出最消耗記憶體的sql語句來優化,
是select出來的無用欄位太多了,還是表之間的關聯太多了,還是無效的排序太多了,這都是消耗記憶體的操作,只有瞭解什麼操作是消耗記憶體的,才能有針對性
的優化

在瞭解sql過程之前,我們有必要了解一些概念:
硬解析,
軟解析,
物理讀,
邏輯讀,
buffer
父遊標
子游標

下面我們來詳細瞭解一下sql語句從客戶端發起,到資料庫服務端返回資料,中間到底發生了什麼事情,我們以select username from tbuser為例
實驗環境:oracle    專用伺服器模式

oracle要判斷語法是否正確
查詢的表(tbuser)是否存在
當前使用者是否有許可權使用該表
select出的欄位username是否存在

以上條件只要有一個失敗,就會中止查詢

上面的判斷都是在pga中進行的,如果判斷都正確的話,就會進入到sga中查詢該語句是否在sga的share pool中存在,如果存在,則說明該語句曾經執行過,oracle會充分利用該資源,
oracle判斷sql是否相同,是通過把sql轉換為asc碼來比較的,所以說,如果語句中大小寫不相同,或者多一個空格,少一個空格,oracle都會認為不一樣,重新解析該sql語句

比如:select username from tbuser和select userName from tbuser就是不一樣的sql語句,oracle會解析倆次,不能充分共享sql語句,會造成硬解析太多,效能下降

如果要執行的sql語句在share pool中已經存在,就可以共享該語句的父遊標了,那能不能共享子游標呢,還不一定

 

待續。。。

相關文章