從一條select語句看Oracle資料庫查詢工作原理 - 轉

ningzi82發表於2010-10-19
 本文結合一條簡單的select語句,看Oracle資料庫後臺的運作機制。這對於我們之後的系統管理與故障排除非常有幫助。

  【IT專家網獨家】假如,我們現在利用Select語句從資料庫查詢資料,Oracle資料庫是如何運作的呢?從中我們可以領悟到什麼呢?下面,就結合一條簡單的select語句,看看Oracle資料庫後臺的運作機制。這對於我們之後的系統管理與故障排除非常有幫助。

[@more@]

  第一步:客戶端把語句發給伺服器端執行。

  當我們在客戶端執行select語句時,客戶端會把這條SQL語句傳送給伺服器端,讓伺服器端的程式來處理這語句。也就是說,Oracle客戶 端是不會做任何的操作,他的主要任務就是把客戶端產生的一些SQL語句傳送給伺服器端。雖然在客戶端也有一個資料庫程式,但是,這個程式的作用跟伺服器上 的程式作用事不相同的。伺服器上的資料庫程式才會對SQL語句進行相關的處理。不過,有個問題需要說明,就是客戶端的程式跟伺服器的程式是一一對應的。也 就是說,在客戶端連線上伺服器後,在客戶端與伺服器端都會形成一個程式,客戶端上的我們叫做客戶端程式;而伺服器上的我們叫做伺服器程式。所以,由於所有 的SQL語句都是伺服器程式執行的,所以,有些人把伺服器程式形象地比喻成客戶端程式的“影子”。

  第二步:語句解析。

  當客戶端把SQL語句傳送到伺服器後,伺服器程式會對該語句進行解析。同理,這個解析的工作,也是在伺服器端所進行的。雖然這只是一個解析的動作,但是,其會做很多“小動作”。

  1、查詢快取記憶體。伺服器程式在接到客戶端傳送過來的SQL語句時,不會直接去資料庫查詢。而是會先在資料庫的快取記憶體中去查詢,是否存在相同 語句的執行計劃。如果在資料快取記憶體中,剛好有其他人使用這個查詢語句的話,則伺服器程式就會直接執行這個SQL語句,省去後續的工作。所以,採用高速數 據快取的話,可以提高SQL語句的查詢效率。一方面是從記憶體中讀取資料要比從硬碟中的資料檔案中讀取資料效率要高,另一方面,也是因為這個語句解析的原 因。

  不過這裡要注意一點,這個資料快取跟有些客戶端軟體的資料快取是兩碼事。有些客戶端軟體為了提高查詢效率,會在應用軟體的客戶端設定資料快取。 由於這些資料快取的存在,可以提高客戶端應用軟體的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體資料快取的存在,導致修改的資料不能 及時反映到客戶端上。從這也可以看出,應用軟體的資料快取跟資料庫伺服器的高速資料快取不是一碼事。

  2、語句合法性檢查。

  當在快取記憶體中找不到對應的SQL語句時,則資料庫伺服器程式就會開始檢查這條語句的合法性。這裡主要是對SQL語句的語法進行檢查,看看其是 否合乎語法規則。如果伺服器程式認為這條SQL語句不符合語法規則的時候,就會把這個錯誤資訊,反饋給客戶端。在這個語法檢查的過程中,不會對SQL語句 中所包含的表名、列名等等進行SQL他只是語法上的檢查。

  3、語言含義檢查。

  若SQL語句符合語法上的定義的話,則伺服器程式接下去會對語句中的欄位、表等內容進行檢查。看看這些欄位、表是否在資料庫中。如果表名與列名不準確的話,則資料庫會就會反饋錯誤資訊給客戶端。

  所以,有時候我們寫select語句的時候,若語法與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名錯誤。若能夠掌握這個順序的話,則在應用程式排錯的時候,可以節省時間。

  4、獲得物件解析鎖。

  當語法、語義都正確後,系統就會對我們需要查詢的物件加鎖。這主要是為了保障資料的一致性,防止我們在查詢的過程中,其他使用者對這個物件的結構發生改變。對於加鎖的原理與方法,我在其他文章中已經有專門敘述,在這裡就略過不談了。

  5、資料訪問許可權的核對。

  當語法、語義透過檢查之後,客戶端還不一定能夠取得資料。伺服器程式還會檢查,你所連線的使用者是否有這個資料訪問的許可權。若你連線上伺服器的用 戶不具有資料訪問許可權的話,則客戶端就不能夠取得這些資料。故,有時候我們查詢資料的時候,辛辛苦苦地把SQL語句寫好、編譯透過,但是,最後系統返回個 “沒有許可權訪問資料”的錯誤資訊,讓我們氣半死。這在前端應用軟體開發除錯的過程中,可能會碰到。所以,要注意這個問題,資料庫伺服器程式先檢查語法與語 義,然後才會檢查訪問許可權。

  6、確定最佳執行計劃。

  當語句與語法都沒有問題,許可權也匹配的話,伺服器程式還是不會直接對資料庫檔案進行查詢。伺服器程式會根據一定的規則,對這條語句進行最佳化。不 過要注意,這個最佳化是有限的。一般在應用軟體開發的過程中,需要對資料庫的sql語言進行最佳化,這個最佳化的作用要大大地大於伺服器程式的自我最佳化。所以, 一般在應用軟體開發的時候,資料庫的最佳化是少不了的。

  當伺服器程式的最佳化器確定這條查詢語句的最佳執行計劃後,就會將這條SQL語句與執行計劃儲存到資料快取記憶體。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,而直接執行SQL語句,提高SQL語句處理效率。

具體見:

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

相關文章