Oracle SQL語句解析過程你造么?
來自: http://dbaplus.cn/news-10-251-1.html
Oracle中,SQL語句可分為DDL和DML兩類。對于DDL,因為很少被共享使用,故幾乎每次執行時,都需要進行硬解析。而對于DML,會根據實際情況進行硬解析或軟解析。這些過程都是如何進行的,什么是硬解析,什么又是軟解析呢?我們將在下文揭曉。
SQL語句的解析過程,從總體上,可分為四個階段:
-
語法檢查
-
語意檢查
-
解析階段
-
執行階段
針對每個階段,我們可以做個詳細的劃分:
</div>
對SQL語句進行語法檢查,檢查是否有語法錯誤,比如from有沒有寫錯,如果寫錯,則退出解析過程。
</div>
</div>
這里主要是檢查對象和權限,可分為以下三步:
1、 到數據字典里校驗SQL語句中涉及的對象和列是否都存在,如果不存在,則退出解析過程。
2、 將對象進行名稱轉換。比如將同義詞轉換成實際的對象,如果轉換失敗,則退出解析過程。
3、 檢查用戶是否具有訪問轉換后的對象的權限。如果沒有權限,則退出解析過程。
</div>
</div>
這一階段主要是對SQL執行的環境進行判斷,如綁定變量是否一樣,語言環境是否一樣等。可分為以下五步:
1、 對SQL文本進行HASH運算,并定位對象的句柄
這里是區分大小寫、空格、注釋等,定位到相同的HASH桶和HASH桶內的LIBRARY CACHE 對象句柄。
2、 檢查對象的相關性
主要檢查SQL對象與LIBRARY CACHE的同名對象是不是屬于相同的OWNER。
3、 檢查綁定變量是否一樣
主要檢查以下內容:
-
綁定名是否一樣,如應用代碼生成的綁定1、:SYS_B_0,與SQLPLUS生成的綁定變量:b1是不一樣的。
-
綁定數據類型和綁定變量長度是否一樣,如綁定的數據類型(char、number)不一致,字符串綁定變量的長度是否一樣,如綁定值1和33可能是不同的子游標。
4、 檢查語言環境、排序環境是否一樣
例如,在會話級重新設置過語言環境,那么SQL是不能共享的。
5、 創建執行計劃
根據RBO或CBO,生成一個最優的執行計劃,這也是最消耗CPU的一步。
</div>
</div>
通過前三個階段一系列的檢查通過后,SQL語句將進入執行階段,這里可分為三步:
1、 將該游標所產生的執行計劃、SQL文本等裝載進library cache的若干個heap中。
2、 通過私有CURSOR來執行SQL。
3、 如果是SELECT,則需要UGA來FETCH數據。
以上就是SQL解析的全過程,當前三個階段全部要執行的時候,就是硬解析,發生在SQL第一次執行的時候。前三個階段,省略了其中的一步,就是軟解析,發生在SQL第二次執行的時候。當SQL第三次執行的時候,會把SQL的共享CURSOR復制到私有CURSOR中,由session_cached_cursors決定UGA中私有游標的數量。當SQL第四次執行的時候,會直接訪問私有CURSOR,直接從第四階段的第二步開始執行,這就是所謂的軟解析。
下面再提供一個語句,以查詢SQL不能被共享的原因:
在這些原因中,簡單列出常見的原因:
-
SQL_TYPE_MISMATCH:類型不匹配
-
AUTH_CHECK_MISMATCH:語句授權不匹配
-
LANGUAGE_MISMATCH:語言環境不匹配
-
USER_BIND_PEEK_MISMATCH:在cursor_sharing= SIMILAR模式下 where id > 1 和 where id > 2會生成2個cursor
-
UNBOUND_CURSOR:沒有綁定
SQL的解析是比較消耗CPU的。了解它的全過程, 可以讓數據庫管理員在分析問題的時候有比較清淅的思路, 對分析SQL問題、shared_pool問題都有非常大的幫助。
作者介紹:溫偉靈
-
新炬網絡高級技術專家。 六年的IT運維經驗。
-
具有30TB級的OLTP數據庫運維經驗,擅長故障診斷、處理。
-
精通ORACLE數據庫的內存結構、RAC、DataGuard等,在備份恢復、GoldenGate方面有深入的鉆研。
-
目前負責十多個客戶的數據庫運維工作,具有交通、金融、政府、移動、醫療等行業的運維經驗。
小編精心為大家挑選了近日最受歡迎的幾篇熱文:
(關注訂閱號 dbaplus ,回復以下數字,即可獲取相應文章)
回復 001 ,看陳愛珍《從文藝女到技術咖,一位美女工程師的華麗轉身》;
回復 002 ,看丁俊的《【重磅干貨】看了此文,Oracle SQL優化文章不必再看!》;
回復 003 ,看胡怡文《PG,一道橫跨oltp到olap的夢想之橋》;
回復 004 ,看陳科《memcached&redis等分布式緩存的實現原理》;
回復 005 ,看陸傳勝《聽阿里巴巴JVM工程師為你分析常見Java故障案例》;
回復 006 ,看鄭曉輝《存儲和數據庫不得不說的故事》;
回復 007 ,看袁偉翔《揭秘Oracle數據庫truncate原理》;
回復 008 ,看楊建榮《立等可取:工具定制讓Oracle優化變得更簡單快捷》;
回復 009 ,看丁啟良《LINUX類主機JAVA應用程序占用CPU、內存過高分析手段》;
回復 010 ,看徐桂林《以應用為中心的企業混合云管理》。