程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 閒扯Oracle SQL語句解析步驟

閒扯Oracle SQL語句解析步驟

編輯:Oracle數據庫基礎

Oracle還是比較常用的,於是我研究了一下Oracle SQL語句,在這裡拿出來和大家分享一下,希望對大家有用。我們都知道在Oracle SQL語句在執行之前都需要經過解析,這裡面又分為軟解析和硬解析。那麼這兩種解析有何不同之處呢?它們又分別是如何進行解析呢?Oracle內部解析的步驟又是如何進行的呢?下面我們就這些話題進行共同探討。

在Oracle中存在兩種類型的SQL語句,一類為DDL語句,他們是從來不會共享使用的,也就是每次執行都需要進行硬解析。還有一類就是DML語句,他們會根據情況選擇要麼進行硬解析,要麼進行軟解析。在Oracle 8i OCP教材的023中1-12有說明SQL語句的解析步驟,當一條SQL語句從客戶端進程傳遞到服務器端進程後,需要執行如下步驟:
◆在共享池中搜索 SQL語句的現有副本
◆驗證 SQL 語句的語法是否准確
◆執行數據字典查找來驗證表和列的定義
◆獲取對象的分析鎖以便在語句的分析過程中對象的定義不會改變
◆檢查用戶訪問引用方案對象的權限
◆確定語句的最佳執行計劃
◆將語句和執行計劃載入共享的 SQL 區

這個先入為主的概念一直占據著我的腦海,我認為硬解析就是上面幾個步驟。相對於硬解析,軟解析的步驟就是上面第一步找到現有SQL語句的副本後,只需要驗證用戶是否有權限執行就是了,這樣省略上面好幾個步驟,相對硬解析來說性能開銷就非常小了。即使是在論壇上和大家討論時,我也一直堅持這個看法。直到前一天看了Tom的《Effective Oracle By Design》中關於語句處理的章節後,我才知道這個自己一直堅持的觀點事實上是錯誤的。

事實上,在Oracle SQL語句的解析步驟如下:

1、 語法檢測。判斷一條Oracle SQL語句的語法是否符合SQL的規范,比如執行:SQL> selet * from emp;我們就可以看出由於Select關鍵字少了一個“c”,這條語句就無法通過語法檢驗的步驟了。

2、 語義檢查。語法正確的SQL語句在解析的第二個步驟就是判斷該SQL語句所訪問的表及列是否准確?用戶是否有權限訪問或更改相應的表或列?比如如下語句:

  1. SQL> select * from emp;  
  2. select * from emp  
  3. *  
  4. ERROR at line 1:  
  5. ORA-00942: table or vIEw does not exist 

由於查詢用戶沒有可供訪問的emp對象,因此該Oracle SQL語句無法通過語義檢查。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved