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


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

SQL語句的執行過程一般如下:

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

clip_image001

解析

 

服務器進程接收到一個SQL語句時,首先要將其轉換成執行這個SQL語句的最有效步驟,這些步驟被稱為執行計划。

Step 1:檢查共享池中是否有之前解析相同的SQL語句后所存儲的SQL文本、解析樹和執行計划。如果能從共享池的緩存庫中找到之前解析過生成的執行計划,則SQL語句則不需要再次解析,便可以直接由庫緩存得到之前所產生的執行計划,從而直接跳到綁定或執行階段,這種解析稱作軟解析。

但是如果在共享池的庫緩存中找不到對應的執行計划,則必須繼續解析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

 

 下面我們先清空共享池緩存的執行計划,然后使用綁定變量,查看執行計划的變換

 

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查詢語句才有的步驟。獲取查詢的記錄行,必要的時候對查詢結果排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM