1,sql解析
sql處理的第一階段就是sql解析。當應用程式發出sql語句時,該應用程式向資料庫發出乙個解析呼叫,以準備執行該語句,解析呼叫會開啟或建立乙個游標,它是乙個對特定於會話的私有sql區的控制代碼,其中包含了已分析的sql語句和其他處理資訊。游標和私有sql區位於pga中。
解析呼叫期間,資料庫會執行以下檢查:
● 語法檢查
● 語義檢查 --物件和列是否存在
● 共享池檢查
資料庫執行共享池檢查,以確定時候可以跳過占用大量資源的語句處理步驟。為此,資料庫使用一種雜湊演算法為每個sql語句生成乙個雜湊值。語句的雜湊值即是在v$sql.sql_id中顯示的sql_id(參考筆記:區分4個與sql相關的字段:hash_value、sql_hash_value、plan_hash_value 和 sql_id),當使用者提交乙個sql語句時,資料庫搜尋共享sql區,以檢視是否存在乙個現成的已分析的語句具有相同的雜湊值。sql語句的雜湊值有別於下列值:
● 該語句的記憶體位址值(v$sql的address字段值)
● 該語句執行計畫的雜湊值(v$sql_plan檢視的plan_hash_value字段值)
基於所提交語句的型別和雜湊檢查的結果,解析操作分為以下類別:
● 硬解析
如果資料庫不能重用現有**,則它必須生成應用程式**的乙個新的可執行版本,次操作稱為乙個硬解析,或庫快取未命中。資料庫對ddl始終執行硬解析。
在硬解析期間,資料庫多次訪問庫快取和資料字典快取以檢查資料字典。當資料庫訪問這些區域時,它在所需物件上使用乙個叫做閂鎖的序列化裝置,以便它們的定義不糊被更改。閂鎖的爭用會增加語句的執行時間,並降低併發性。
● 軟解析
任何不適硬解析的解析都是軟解析。如果提交的語句與在共享式中某個可重用sql語句相同,則資料庫將重用該現有**。重用**也稱為庫快取命中。
一般的,軟解析比硬解析更可取,因為資料庫可以跳過優化和行源生成步驟,而直接進入到直行階段。下圖是在專用伺服器體系結構中,乙個update語句的共享池檢查的簡化表示。
(看來,sql文字的雜湊值是在pga中產生的)。
如果檢查到共享庫中有乙個語句具有相同的雜湊值,則資料庫在執行語義和環境檢查(工作區大小或優化器設定等),當然還有語句本身的書寫(大小寫,空格,注釋等)。
SQL執行流程
mysql的查詢流程 1 查詢快取 server如果在查詢快取中發現了這條sql語句,就會直接將結果返回給客戶端 如果沒有,就進入到解析器階段。需要說明的是,因為查詢快取往往效率不高,所以在mysql8.0以後就拋棄了這個功能 兩個sql需要完全一樣,包括空格 注釋 大小寫都必須一樣 2 解析器 在...
SQL語句執行流程
第一步 客戶端把語句發給伺服器端執行 當我們在客戶端執行sql語句時,客戶端會把這條 sql 語句傳送給伺服器端,讓伺服器端的程序來處理這語句。也就是說,oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生的一些 sql 語句傳送給伺服器端。雖然在客戶端也有乙個資料庫程序但這個程序的...
MySQL執行select語句內部流程
一般來說,資料是儲存到服務端的,所以從客戶端讀取服務端資料要經歷如下幾個過程 client query cache 查詢快取 預設關閉 parse 解析器 pre processor 預處理器 optimizer 優化器 execution plans 執行計畫 executor 執行器 stora...