SQL語句執行過程詳解

2022-03-28 10:37:33 字數 2416 閱讀 2349

一、sql語句執行原第一步:客戶端把語句發給伺服器端執行當我們在客戶端執行 select 語句時,客戶端會把這條 sql 語句傳送給伺服器端,讓伺服器端的程序來處理這語句。也就是說,oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些 sql 語句傳送給伺服器端。雖然在客戶端也有乙個資料庫程序,但是,這個程序的作用跟伺服器上的程序作用事不相同的。伺服器上的資料庫程序才會對sql 語句進行相關的處理。不過,有個問題需要說明,就是客戶端的程序跟伺服器的程序是一一對應的。也就是說,在客戶端連線上伺服器後,在客戶端與伺服器端都會形成乙個程序,客戶端上的我們叫做客戶端程序;而伺服器上的我們叫做伺服器程序。  

第二步:語句解析當客戶端把 sql 語句傳送到伺服器後,伺服器程序會對該語句進行解析。同理,這個解析的工作,也是在伺服器端所進行的。雖然這只是乙個解析的動作,但是,其會做很多「小動作」。

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

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

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

3. 語言含義檢查(data dict cache)。若 sql 語句符合語法上的定義的話,則伺服器程序接下去會對語句中的字段、表等內容進行檢查。看看這些字段、表是否在資料庫中。如果表名與列名不準確的話,則資料庫會就會反饋錯誤資訊給客戶端。所以,有時候我們寫 select 語句的時候,若語法與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名錯誤。

4. 獲得物件解析鎖(control structer)。當語法、語義都正確後,系統就會對我們需要查詢的物件加鎖。這主要是為了保障資料的一致性,防止我們在查詢的過程中,其他使用者對這個物件的結構發生改變。

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

6. 確定最佳執行計畫 ?。當語句與語法都沒有問題,許可權也匹配的話,伺服器程序還是不會直接對資料庫檔案進行查詢。伺服器程序會根據一定的規則,對這條語句進行優化。不過要注意,這個優化是有限的。一般在應用軟體開發的過程中,需要對資料庫的 sql 語言進行優化,這個優化的作用要大大地大於伺服器程序的自我優化。所以,一般在應用軟體開發的時候,資料庫的優化是少不了的。當伺服器程序的優化器確定這條查詢語句的最佳執行計畫後,就會將這條 sql 語句與執行計畫儲存到資料快取記憶體。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,而直接執行 sql 語句,提高 sql 語句處理效率。

第三步:語句執行語句解析只是對 sql 語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意思。等到語句解析完成之後,資料庫伺服器程序才會真正的執行這條 sql 語句。這個語句執行也分兩種情況。

一是若被選擇行所在的資料塊已經被讀取到資料緩衝區的話,則伺服器程序會直接把這個資料傳遞給客戶端,而不是從資料庫檔案中去查詢資料。

若資料不在緩衝區中,則伺服器程序將從資料庫檔案中查詢相關資料,並把這些資料放入到資料緩衝區中(buffer cache)。

第四步:提取資料當語句執行完成之後,查詢到的資料還是在伺服器程序中,還沒有被傳送到客戶端的使用者程序。所以,在伺服器端的程序中,有乙個專門負責資料提取的一段**。他的作用就是把查詢到的資料結果返回給使用者端程序,從而完成整個查詢動作。從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過程中,需要注意以下幾點:

SQL語句執行過程詳解

當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式執行 如下圖所示,當向mysql傳送乙個請求的時候,mysql到底做了什麼 1.客戶端傳送一條查詢給伺服器。2.伺服器先檢...

MySQL探秘 SQL語句執行過程詳解

當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式執行。如下圖所示,當向mysql傳送乙個請求的時候,mysql到底做了什麼 客戶端傳送一條查詢給伺服器。伺服器先檢查查詢快...

SQL語句的執行過程

1.語法校驗 如果在sql計畫快取中沒有對應的執行計畫,伺服器首先會對使用者請求的sql語句進行語法效驗,如果有語法錯誤,伺服器會結束查詢操作,並用返回相應的錯誤資訊給呼叫它的應用程式。注意 此時返回的錯誤資訊中,只會包含基本的語法錯誤資訊,例如select 寫成selec等,錯誤資訊中如果包含一列...