在資料庫管理工具端輸入一條sql語句並獲得響應結果通常會經過哪些過程,這就得首先了解我們的資料庫結構:
1.儲存管理層:包括儲存管理、日誌管理、併發控制、事務管理、緩衝區管理和封鎖管理等;
2.sql處理層:包括sql語法解析、重寫、優化、執行、執行計畫快取與結果集快取;
3.介面層:比如常用的jdbc、odbc等;
4.工具層,比如常用的資料庫物件管理工具;
sql的查詢執行計畫主要包括查詢分析和查詢優化
輸入sql字串--詞法分析--語法分析--語義分析--構造查詢分析樹--重寫查詢分析樹(包括檢視的實現和使用者自定義規則)
記錄下sql語句在執行過程中的處理:
在oracle資料庫系統架構下,sql語句由使用者程序產生,然後傳到相對應的服務端程序,之後由伺服器程序執行該sql語句,如果是select語句,伺服器程序還需要將執行結果回傳給使用者程序。
首先是解析:目的是確定執行計畫,找到最優的執行方案。分為軟解析(已經有解析完成的快取,解析過的sql會有乙個hash值與之相對應)和硬解析(語法分析,語義分析,許可權檢查,檢視轉換和表示式轉換,決定最優的執行計畫,快取sql文字,解析樹,執行計畫)
繫結:sql語句中使用了繫結變數,掃瞄繫結變數的宣告,給繫結變數賦值
執行:不同的操作執行過程不一樣,查詢操作(緩衝區快取(可以設定),邏輯讀取,物理讀取),修改操作(首先確定是否在緩衝區快取中,如果不在將資料弄到資料庫快取中,對修改的資料取得資料行鎖定,取得獨佔鎖,日誌緩衝區互動,資料修改,變為髒緩衝)
提取:只有select語句才有,獲得查詢的結果,必要的時候對結果進行排序。
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:修改資料行的內容,如果之前的緩衝為乾淨緩衝,則此時將變為髒緩衝。
SQL語句的執行過程
1.語法校驗 如果在sql計畫快取中沒有對應的執行計畫,伺服器首先會對使用者請求的sql語句進行語法效驗,如果有語法錯誤,伺服器會結束查詢操作,並用返回相應的錯誤資訊給呼叫它的應用程式。注意 此時返回的錯誤資訊中,只會包含基本的語法錯誤資訊,例如select 寫成selec等,錯誤資訊中如果包含一列...
SQL語句的執行過程
1 sql的執行過程 客戶端發起請求 oracle server process 接收 放入到sga中share pool存放 通過cpu解析相應的執行計畫 執行計畫存放在share pool中 在從buffer cache中把相應的資料取出來,如不存在,從資料檔案中把資料調入到buffer cac...
SQL語句執行過程詳解
當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解了這一點,很多查詢優化工作實際上就是遵循一些原則能夠按照預想的合理的方式執行 如下圖所示,當向mysql傳送乙個請求的時候,mysql到底做了什麼 1.客戶端傳送一條查詢給伺服器。2.伺服器先檢...