sql執行過程分析

2021-08-31 10:11:50 字數 1102 閱讀 8747

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果了解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助

首先了解一下執行sql,需要消耗什麼資源,

cpu,

記憶體,io,

我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,什麼情況下消耗io,只有了解了這些,我們才能

有針對性的優化,如果oracle的瓶頸在記憶體上,就要通過一定的手段(可以檢視awr報告,也可以直接查詢oracle統計表)去找出最消耗記憶體的sql語句來優化,

是select出來的無用欄位太多了,還是表之間的關聯太多了,還是無效的排序太多了,這都是消耗記憶體的操作,只有了解什麼操作是消耗記憶體的,才能有針對性

的優化在了解sql過程之前,我們有必要了解一些概念:

硬解析,

軟解析,

物理讀,

邏輯讀,

buffer

父游標子游標

下面我們來詳細了解一下sql語句從客戶端發起,到資料庫服務端返回資料,中間到底發生了什麼事情,我們以select username from tbuser為例

實驗環境:oracle    專用伺服器模式

oracle要判斷語法是否正確

查詢的表(tbuser)是否存在

當前使用者是否有許可權使用該錶

select出的字段username是否存在

以上條件只要有乙個失敗,就會中止查詢

上面的判斷都是在pga中進行的,如果判斷都正確的話,就會進入到sga中查詢該語句是否在sga的share pool中存在,如果存在,則說明該語句曾經執行過,oracle會充分利用該資源,

oracle判斷sql是否相同,是通過把sql轉換為asc碼來比較的,所以說,如果語句中大小寫不相同,或者多乙個空格,少乙個空格,oracle都會認為不一樣,重新解析該sql語句

比如:select username from tbuser和select username from tbuser就是不一樣的sql語句,oracle會解析倆次,不能充分共享sql語句,會造成硬解析太多,效能下降

如果要執行的sql語句在share pool中已經存在,就可以共享該語句的父游標了,那能不能共享子游標呢,還不一定

待續。。。

sql執行過程

程式中寫的一條sql傳送到伺服器端 查詢此條sql是否存在執行計畫 如果存在則直接呼叫已經編譯好的執行計畫 否則進入下一步。如果sql計畫快取中沒有對應的執行計畫,則進行語法校驗 檢視是否存在語法錯誤 如果語法沒有錯誤則進行語義校驗,例如,表名,列名,儲存過程等等資料庫物件是否真正存在 如果語義沒有...

SQL執行過程

mysql server pluggable storage engines 1 客戶端 服務端通訊協議 查詢快取,如果有資料返回,否則繼續 複製 2 解析器根據解析樹解析 預處理器檢測正常繼續,否則報錯 比如要查詢的字段不存在 複製 3 查詢優化器 explain查詢執行計畫 好比以前我們除錯介面...

Oracle學習之sql語句執行過程分析

1.sql語句通過網路傳送給oracle例項 2.oracle server process接收到sql語句後進行必要的檢查,然後再shared pool中查詢sql語句及其執行計畫,如果查詢到,則執行查詢到的執行計畫,如果未查找到相應的sql語句及執行計畫,則發生硬解析,選出最優的執行計畫.3.如...