SQL語句在數據庫中處理過程是怎樣的呢?執行順序呢?在回答這個問題前,咱們先來回顧一下:在ORACLE數據庫系統架構下,SQL語句由用戶進程產生,而後傳到相對應的服務端進程,以後由服務器進程執行該SQL語句,若是是SELECT語句,服務器進程還須要將執行結果回傳給用戶進程。數據庫
SQL語句的執行過程通常以下:緩存
解析(PARSE)—— 綁定(BIND)——執行(EXECUTE)——提取(FETCH 只有SELECT才須要這步)服務器
解析架構
服務器進程接收到一個SQL語句時,首先要將其轉換成執行這個SQL語句的最有效步驟,這些步驟被稱爲執行計劃。優化
Step 1:檢查共享池中是否有以前解析相同的SQL語句後所存儲的SQL文本、解析樹和執行計劃。若是能從共享池的緩存庫中找到以前解析過生成的執行計劃,則SQL語句則不須要再次解析,即可以直接由庫緩存獲得以前所產生的執行計劃,從而直接跳到綁定或執行階段,這種解析稱做軟解析。spa
可是若是在共享池的庫緩存中找不到對應的執行計劃,則必須繼續解析SQL、生成執行計劃,這種解析稱做硬解析設計
在緩存池解析過的SQL,會有一個對應的哈希值與之對應,你能夠經過V$SQL視圖來查詢,請看下面一個例子:日誌
SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO =10; SQL>SELECT * FROM SCOTT.DEPT WHERE DEPTNO =20; SQL> SELECT HASH_VALUE , ADDRESS, EXECUTIONS ,SQL_TEXT 2 FROM V$SQL 3 WHERE SQL_TEXT LIKE 'SELECT * FROM SCOTT.DEPT WHERE DEPTNO%'
4 ; HASH_VALUE ADDRESS EXECUTIONS SQL_TEXT ---------- -------- ---------- --------------------------------------------------------------------------------
442836625 27EE4B7C 1 SELECT * FROM SCOTT.DEPT WHERE DEPTNO =20
4215405494 27EEA3BC 1 SELECT * FROM SCOTT.DEPT WHERE DEPTNO =10
下面咱們先清空共享池緩存的執行計劃,而後使用綁定變量,查看執行計劃的變換code
SQL> ALTER SYSTEM FLUSH SHARED_POOL; System altered SQL> VARIABLE deptno NUMBER; SQL> EXECUTE :deptno := 10; PL/SQL procedure successfully completed deptno ---------
10 SQL> SELECT * FROM SCOTT.DEPT WHERE DEPTNO=:deptno; DEPTNO DNAME LOC ------ -------------- -------------
10 ACCOUNTING NEW YORK SQL> EXECUTE :deptno :=20; PL/SQL procedure successfully completed deptno ---------
20 SQL> SELECT * FROM SCOTT.DEPT WHERE DEPTNO=:deptno; DEPTNO DNAME LOC ------ -------------- -------------
20 RESEARCH DALLAS SQL> SELECT HASH_VALUE , ADDRESS, EXECUTIONS ,SQL_TEXT 2 FROM V$SQL 3 WHERE SQL_TEXT LIKE ' SELECT * FROM SCOTT.DEPT WHERE DEPTNO%'; HASH_VALUE ADDRESS EXECUTIONS SQL_TEXT ---------- -------- ---------- --------------------------------------------------------------------------------
3669302979 27D2BA1C 2 SELECT * FROM SCOTT.DEPT WHERE DEPTNO=:deptno
Step 2:語法分析,分析SQL語句的語法是否符合規範,衡量語句中各表達式的意義對象
Step 3:檢查是否存在語義錯誤和權限。語義分析,檢查語句中設計的全部數據庫對象是否存在,且用戶有相應的權限。
Step 4:視圖轉換和表達式轉換 將涉及視圖的查詢語句轉換爲相應的對基表查詢語句。將複雜表達式轉化較爲簡單的等效鏈接表達式。
Step 5:決定最佳執行計劃。優化器會生成多個執行計劃,在按統計信息帶入,找出執行成本最小的執行計劃,做爲執行此SQL語句的執行計劃
Step 6:將SQL文本、解析樹、執行計劃緩存到庫緩存,存放地址以及SQL語句的哈希值。
綁定
若是SQL語句中使用了綁定變量,掃描綁定變量的聲明,給綁定變量賦值。則此時將變量值帶入執行計劃。
執行
此階段按照執行計劃執行SQL,產生執行結果。不一樣類型的SQL語句,執行過程也不一樣。
SELECT查詢
檢查所需的數據塊是否已經在緩衝區緩存中,若是已經在緩衝區緩存中,直接讀取器內容便可。這種讀取方式稱爲邏輯讀取。若是所需數據不在緩衝區緩存中,則服務器進程須要先掃描數據塊,讀取相應數據塊到緩衝區緩存,這種讀取方式稱爲物理讀。和邏輯讀相比較,它更加耗費CPU和IO資源。
修改操做(INSERT、UPDATE、DELETE)
Step 1:檢查所需的數據庫是否已經被讀取到緩衝區緩存中。若是已經存在緩衝區緩存,則執行Step 3
Step 2:若所需的數據庫並不在緩衝區緩存中,則服務器將數據塊從數據文件讀取到緩衝區緩存中
Step 3:對想要修改的表取得的數據行鎖定(Row Exclusive Lock),以後對所須要修改的數據行取得獨佔鎖
Step 4:將撤銷數據的Redo記錄複製到日誌緩衝區,產生數據行的撤銷數據,將數據行修改的Redo記錄複製到日誌緩衝區,修改數據行。
Step 5: 產生數據修改的撤銷數據
Step 6:複製數據修改的Redo記錄到日誌緩衝區
Step 7:修改數據行的內容,若是以前的緩衝爲乾淨緩衝,則此時將變爲髒緩衝。
提取
提取只有SELECT查詢語句纔有的步驟。獲取查詢的記錄行,必要的時候對查詢結果排序。