2022年10月13日 星期四

2. SQL Query Process

首先我們先來了解當執行一段 SQL 的時候, Oracle 內部是如何將這段 SQL 的結果回應出來。當 Oracle 資料庫接收到一段 SQL 的時候,會經過 Parse 、 Bind 、 Execute 與 Fetch 等階段,這些階段我們稱為 " SQL的生命週期 " 。

SNAG-0646


  • Parse 階段

SQL 在 Parse 階段會進行兩個動作,其一是 SQL 語法檢查,用來確認 SQL 語句的撰寫是否正確;其二是 SQL 語意分析,用來確認 SQL 所描述的物件 (如 table 、 function …等) 是否存在,以及使用者是否有權限來存取這些物件。在檢查完 SQL 語句之後, Oracle 便會依照優化器 (Optimizer) 來決定此 SQL 最佳的執行計畫。


通常 Parse 又可分為 Soft Parse 與 Hard Parse 。 Soft Parse 指的是 Oracle 可以從內存中 (在此為 SGA 中的 Shared_Pool ) 找到相符合的 SQL 語法,無需再對此 SQL 做解析的動作,相對的,若無法從內存中找到相符合的 SQL 語法,就必須對 SQL 重新解析,這個情況我們就稱做為 Hard Parse , SQL 在做完 Hard Parse 之後便會把此語句放入 Shared_Pool 之中。


由於 Soft Parse 無需對 SQL 語句做解析,因此會比 Hard Parse 來得有效率。


  • Bind 階段

若 SQL 語句中含有 Bind Variable ,便會在此階段賦予該變數的值。


  • Execute 階段

此階段會根據 Parse 階段所訂定的執行計畫來執行 SQL ,大部分的 SQL 緩慢都是慢在此 Execute 階段,也是我們常常需要進行 Tuning 的地方。


  • Fetch 階段

最後 Fetch 階段則會根據 SQL 執行的結果於資料庫中擷取與返回數據,每次截取資料的多寡則是以 array 為單位,可於 SQL*PLUS 中設定 arraysize 參數進行更改,預設 arraysize = 50。


當一句 SQL 執行緩慢,我們必須分析出此 SQL 慢在哪一個階段,針對此階段的效能瓶頸做調整。


沒有留言:

張貼留言