SQL語句執行流程

2021-10-04 08:21:41 字數 2389 閱讀 6058

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

當我們在客戶端執行sql語句時,客戶端會把這條 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 語句與執行計畫儲存到資料快取記憶體(library cache)。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,而直接執行 sql 語句,提高 sql 語句處理效率。

第三步:語句執行

語句解析只是對 sql 語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意思。等到語句解析完成之後,資料庫伺服器程序才會真正的執行這條 sql 語句。這個語句執行也分兩種情況。一是若被選擇行所在的資料塊已經被讀取到資料緩衝區的話,則伺服器程序會直接把這個資料傳遞給客戶端,而不是從資料庫檔案中去查詢資料。若資料不在緩衝區中,則伺服器程序將從資料庫檔案中查詢相關資料,並把這些資料放入到資料緩衝區中(buffer cache)。

第四步:提取資料

當語句執行完成之後,查詢到的資料還是在伺服器程序中,還沒有被傳送到客戶端的使用者程序。所以在伺服器端的程序中,有乙個專門負責資料提取的一段**。他的作用就是把查詢到的資料結果返回給使用者端程序,從而完成整個查詢動作。

SQL執行流程

mysql的查詢流程 1 查詢快取 server如果在查詢快取中發現了這條sql語句,就會直接將結果返回給客戶端 如果沒有,就進入到解析器階段。需要說明的是,因為查詢快取往往效率不高,所以在mysql8.0以後就拋棄了這個功能 兩個sql需要完全一樣,包括空格 注釋 大小寫都必須一樣 2 解析器 在...

SQL語句在MySQL中的執行流程

本篇文章分析sql語句在mysql中的執行流程,包括sql的查詢在mysql內部會怎麼流轉,sql語句的更新是怎麼完成的。在分析之前我們一起看看mysql的基礎架構,知道了 mysql由那些元件組成以及這些元件的作用是什麼,可以幫助我們理解和解決這些問題。下面是mysql的乙個簡要架構圖 serve...

SQL 內部執行流程

1,sql解析 sql處理的第一階段就是sql解析。當應用程式發出sql語句時,該應用程式向資料庫發出乙個解析呼叫,以準備執行該語句,解析呼叫會開啟或建立乙個游標,它是乙個對特定於會話的私有sql區的控制代碼,其中包含了已分析的sql語句和其他處理資訊。游標和私有sql區位於pga中。解析呼叫期間,...