ORACLE數據庫SQL語句的執行過程

  SQL語句在數據庫中處理過程是怎樣的呢?執行順序呢?在回答這個問題前,咱們先來回顧一下:在ORACLE數據庫系統架構下,SQL語句由用戶進程產生,而後傳到相對應的服務端進程,以後由服務器進程執行該SQL語句,若是是SELECT語句,服務器進程還須要將執行結果回傳給用戶進程。數據庫

SQL語句的執行過程通常以下:緩存

解析(PARSE)—— 綁定(BIND)——執行(EXECUTE)——提取(FETCH 只有SELECT才須要這步)服務器

clip_image001

解析架構

 

服務器進程接收到一個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查詢語句纔有的步驟。獲取查詢的記錄行,必要的時候對查詢結果排序。

相關文章
相關標籤/搜索