【轉載】Sql執行原理

第一步:客戶端把語句發給服務器端執行:數據庫

  在客戶端鏈接上服務器後,在客戶端與服務器端都會造成一個進程,客戶端上的咱們叫作客戶端進程;而服務器上的咱們叫作服務器進程。全部的SQL語句都是在客戶端進程產生的,在服務器進程執行的緩存

第二步:語句解析:服務器

  當客戶端把SQL語句傳送到服務器後,服務器進程會對該語句進行解析(在服務器上進行)。此時服務器進程會對於SQL語句進行如下操做:優化

一、  查詢高速緩存(位於SGA上一塊SQL共享區域)。對象

服務器進程在接到客戶端傳送過來的SQL語句時,不會直接去數據庫查詢。而是會先在數據庫的高速緩存中去查找,是否存在相同語句的執行計劃。若是在數據高速緩存中,恰好有其餘人使用這個查詢語句的話(此時執行嚴格匹配),則服務器進程就會直接執行這個SQL語句,省去後續的工做。因此,採用高速數據緩存的話,能夠提升SQL語句的查詢效率。一方面是從內存中讀取數據要比從硬盤中的數據文件中讀取數據效率要高,另外一方面,也是由於這個語句解析的緣由。進程

SGA是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle 服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,若是實際內存不夠再往虛擬內存中寫。【百度百科】內存

  二、語句合法性檢查(語法分析器)。效率

  當在高速緩存中找不到對應的SQL語句時,則數據庫服務器進程就會開始檢查這條語句的合法性。這裏主要是對SQL語句的語法進行檢查,看看其是否合乎語法規則。若是服務器進程認爲這條SQL語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客戶端。在這個語法檢查的過程當中,不會對SQL語句中所包含的表名、列名等等進行SQL他只是語法上的檢查。服務器端

  三、語言含義檢查(詞法分析器)。百度

  若SQL語句符合語法上的定義的話,則服務器進程接下去會對語句中的字段、表等內容進行檢查。看看這些字段、表是否在數據庫中。若是表名與列名不許確的話,則數據庫會就會反饋錯誤信息給客戶端。

  四、得到對象解析鎖。

  當語法、語義都正確後,系統就會對咱們須要查詢的對象加鎖。這主要是爲了保障數據的一致性,防止咱們在查詢的過程當中,其餘用戶對這個對象的結構發生改變(保證數據的一致性)。

  五、數據訪問權限的核對。

  當語法、語義經過檢查以後,客戶端還不必定可以取得數據。服務器進程還會檢查,你所鏈接的用戶是否有這個數據訪問的權限。若你鏈接上服務器的用戶不具備數據訪問權限的話,則客戶端就不可以取得這些數據。

  六、肯定最佳執行計劃。

  當語句與語法都沒有問題,權限也匹配的話,服務器進程仍是不會直接對數據庫文件進行查詢。服務器進程會根據必定的規則,對這條語句進行優化(根據數據庫版本規範進行小範圍內優化)。

  當服務器進程的優化器肯定這條查詢語句的最佳執行計劃後,就會將這條SQL語句與執行計劃保存到數據高速緩存。如此的話,等之後還有這個查詢時,就會省略以上的語法、語義與權限檢查的步驟,而直接執行SQL語句,提升SQL語句處理效率。

第三步:語句執行。

  語句解析只是對SQL語句的語法進行解析,以確保服務器可以知道這條語句到底表達的是什麼意思。等到語句解析完成以後,數據庫服務器進程纔會真正的執行這條SQL語句。這個語句執行也分兩種狀況。一是若被選擇行所在的數據塊已經被讀取到數據緩衝區的話,則服務器進程會直接把這個數據傳遞給客戶端,而不是從數據庫文件中去查詢數據。若數據不在緩衝區中,則服務器進程將從數據庫文件中查詢相關數據,並把這些數據放入到數據緩衝區中。

第四步:提取數據。

當語句執行完成以後,查詢到的數據仍是在服務器進程中,尚未被傳送到客戶端的用戶進程。因此,在服務器端的進程中,有一個專門負責數據提取的一段代碼。他的做用就是把查詢到的數據結果返回給用戶端進程,從而完成整個查詢動做。

相關文章
相關標籤/搜索