您好,登錄后才能下訂單哦!
1.語法校驗(yàn)
如果在SQL計(jì)劃緩存中沒有對應(yīng)的執(zhí)行計(jì)劃,服務(wù)器首先會對用戶請求的SQL語句進(jìn)行語法效驗(yàn),如果有語法錯(cuò)誤,服務(wù)器會結(jié)束查詢操作,并用返回相應(yīng)的錯(cuò)誤信息給調(diào)用它的應(yīng)用程序。
注意:此時(shí)返回的錯(cuò)誤信息中,只會包含基本的語法錯(cuò)誤信息,例如select 寫成selec等,錯(cuò)誤信息中如果包含一列表中本沒有的列,此時(shí)服務(wù)器是不會檢查出來的,因?yàn)橹皇钦Z法驗(yàn)證,語義是否正確放在下一步進(jìn)行。
2.檢查語義
語法符合后,就開始驗(yàn)證它的語義是否正確。例如,表名、列名、存儲過程等等數(shù)據(jù)庫對象是否真正存在,如果發(fā)現(xiàn)有不存在的,就會報(bào)錯(cuò)給應(yīng)用程序,同時(shí)結(jié)束查詢。
3.獲得對象的解析鎖
接下來就是獲得對象的解析鎖,我們在查詢一個(gè)表時(shí),首先服務(wù)器會對這個(gè)對象加鎖,這是為了保證數(shù)據(jù)的統(tǒng)一性,如果不加鎖,此時(shí)有數(shù)據(jù)插入,但因?yàn)闆]有加鎖的原因,查詢已經(jīng)將這條記錄讀入,而有的插入會因?yàn)槭聞?wù)的失敗會回滾,就會形成臟讀的現(xiàn)象。
4.用戶訪問權(quán)限認(rèn)證
接下來就是對數(shù)據(jù)庫用戶權(quán)限的驗(yàn)證。SQL語句語法,語義都正確,此時(shí)并不一定能夠得到查詢結(jié)果,如果數(shù)據(jù)庫用戶沒有相應(yīng)的訪問權(quán)限,服務(wù)器會報(bào)出權(quán)限不足的錯(cuò)誤給應(yīng)用程序,在稍大的項(xiàng)目中,往往一個(gè)項(xiàng)目里面會包含好幾個(gè)數(shù)據(jù)庫連接串,這些數(shù)據(jù)庫用戶具有不同的權(quán)限,有的是只讀權(quán)限,有的是只寫權(quán)限,有的是可讀可寫,根據(jù)不同的操作選取不同的用戶來執(zhí)行。稍微不注意,無論你的SQL語句寫的多么完善,完美無缺都沒用。
5.SQL優(yōu)化,選擇最高效的查詢算法
解析的最后一步,就是確定最終的執(zhí)行計(jì)劃。當(dāng)語法、語義、權(quán)限都驗(yàn)證后,服務(wù)器并不會馬上給你返回結(jié)果,而是會針對你的SQL進(jìn)行優(yōu)化,選擇不同的查詢算法以最高效的形式返回給應(yīng)用程序。
例如在做表聯(lián)合查詢時(shí),服務(wù)器會根據(jù)開銷成本來最終決定采用hash join,merge join ,還是loop join,采用哪一個(gè)索引會更高效等等。不過它的自動化優(yōu)化是有限的,要想寫出高效的查詢SQL還是要優(yōu)化自己的SQL查詢語句。
當(dāng)確定好執(zhí)行計(jì)劃后,就會把這個(gè)執(zhí)行計(jì)劃保存到SQL計(jì)劃緩存中,下次在有相同的執(zhí)行請求時(shí),就直接從計(jì)劃緩存中取,避免重新編譯執(zhí)行計(jì)劃。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。