激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 數據庫SQL SELECT查詢的工作原理

數據庫SQL SELECT查詢的工作原理

2020-09-15 17:28積跬步得以至千里 Mysql

今天小編就為大家分享一篇關于數據庫SQL SELECT查詢的工作原理,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

作為Web開發人員,雖并非專業的DBA,但我們總是離不開數據庫。一般開發員只會應用SQL的四條經典語句:select,insert,delete,update。以至于從來沒有研究過它們的工作原理,在這里我們說一說select在數據庫中的工作原理。

B/S架構中最經典的話題無非于三層架構,可以大概分為數據層,業務邏輯層和表示層,而數據層的作用一般都是和數據庫交互,例如查詢記錄。我們經常是寫好查詢SQL,然后調用程序執行SQL。但是它內部的工作流程是怎樣的呢?先做哪一步,然后做哪一步等,我想還有大部分朋友和我一樣都不一定清楚。

數據庫SQL SELECT查詢的工作原理

第一步:應用程序把查詢SQL語句發給服務器端執行

我們在數據層執行SQL語句時,應用程序會連接到相應的數據庫服務器,把SQL語句發送給服務器處理。

第二步:服務器解析請求的SQL語句

1.SQL計劃緩存,經常用查詢分析器的朋友大概都知道這樣一個事實,往往一個查詢語句在第一次運行的時候需要執行特別長的時間,但是如果你馬上或者在一定時間內運行同樣的語句,會在很短的時間內返回查詢結果。

原因:

  • 服務器在接收到查詢請求后,并不會馬上去數據庫查詢,而是在數據庫中的計劃緩存中找是否有相對應的執行計劃,如果存在,就直接調用已經編譯好的執行計劃,節省了執行計劃的編譯時間。
  • 如果所查詢的行已經存在于數據緩沖存儲區中,就不用查詢物理文件了,而是從緩存中取數據,這樣從內存中取數據就會比從硬盤上讀取數據快很多,提高了查詢效率.數據緩沖存儲區會在后面提到。

2.如果在SQL計劃緩存中沒有對應的執行計劃,服務器首先會對用戶請求的SQL語句進行語法效驗,如果有語法錯誤,服務器會結束查詢操作,并用返回相應的錯誤信息給調用它的應用程序。

注意:此時返回的錯誤信息中,只會包含基本的語法錯誤信息,例如select寫成selec等,錯誤信息中如果包含一列表中本沒有的列,此時服務器是不會檢查出來的,因為只是語法驗證,語義是否正確放在下一步進行。

3.語法符合后,就開始驗證它的語義是否正確,例如,表名,列名,存儲過程等等數據庫對象是否真正存在,如果發現有不存在的,就會報錯給應用程序,同時結束查詢。

4.接下來就是獲得對象的解析鎖,我們在查詢一個表時,首先服務器會對這個對象加鎖,這是為了保證數據的統一性,如果不加鎖,此時有數據插入,但因為沒有加鎖的原因,查詢已經將這條記錄讀入,而有的插入會因為事務的失敗會回滾,就會形成臟讀的現象。

5.接下來就是對數據庫用戶權限的驗證,SQL語句語法,語義都正確,此時并不一定能夠得到查詢結果,如果數據庫用戶沒有相應的訪問權限,服務器會報出權限不足的錯誤給應用程序,在稍大的項目中,往往一個項目里面會包含好幾個數據庫連接串,這些數據庫用戶具有不同的權限,有的是只讀權限,有的是只寫權限,有的是可讀可寫,根據不同的操作選取不同的用戶來執行,稍微不注意,無論你的SQL語句寫的多么完善,完美無缺都沒用。

6.解析的最后一步,就是確定最終的執行計劃。當語法,語義,權限都驗證后,服務器并不會馬上給你返回結果,而是會針對你的SQL進行優化,選擇不同的查詢算法以最高效的形式返回給應用程序。例如在做表聯合查詢時,服務器會根據開銷成本來最終決定采用hashjoin,mergejoin,還是loopjoin,采用哪一個索引會更高效等等,不過它的自動化優化是有限的,要想寫出高效的查詢SQL還是要優化自己的SQL查詢語句。

當確定好執行計劃后,就會把這個執行計劃保存到SQL計劃緩存中,下次在有相同的執行請求時,就直接從計劃緩存中取,避免重新編譯執行計劃。

第三步:語句執行

服務器對SQL語句解析完成后,服務器才會知道這條語句到底代表了什么意思,接下來才會真正的執行SQL語句。

這時分兩種情況:

  • 如果查詢語句所包含的數據行已經讀取到數據緩沖存儲區的話,服務器會直接從數據緩沖存儲區中讀取數據返回給應用程序,避免了從物理文件中讀取,提高查詢速度。
  • 如果數據行沒有在數據緩沖存儲區中,則會從物理文件中讀取記錄返回給應用程序,同時把數據行寫入數據緩沖存儲區中,供下次使用。

說明:SQL緩存分好幾種,這里有興趣的朋友可以去搜索一下,有時因為緩存的存在,使得我們很難馬上看出優化的結果,因為第二次執行因為有緩存的存在,會特別快速,所以一般都是先消除緩存,然后比較優化前后的性能表現,這里有幾個常用的方法:

DBCC DROPCLEANBUFFERS

從緩沖池中刪除所有清除緩沖區。

DBCC FREEPROCCACHE

從過程緩存中刪除所有元素。

DBCC FREESYSTEMCACHE

從所有緩存中釋放所有未使用的緩存條目。

SQLServer2005數據庫引擎會事先在后臺清理未使用的緩存條目,以使內存可用于當前條目。但是,可以使用此命令從所有緩存中手動刪除未使用的條目。

這只能基本消除SQL緩存的影響,目前好像沒有完全消除緩存的方案,如果大家有,請指教。

結論:只有知道了服務執行應用程序提交的SQL的操作流程才能很好的調試我們的應用程序。

  • 確保SQL語法正確;
  • 確保SQL語義上的正確性,即對象是否存在;
  • 數據庫用戶是否具有相應的訪問權限。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

原文鏈接:https://www.cnblogs.com/Rawls/p/10272755.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 激情宗合网 | 黄色网址电影 | 91精品一区二区综合在线 | 日本免费a∨ | 欧美毛片免费观看 | 免费看性xxx高清视频自由 | 久久精品黄 | 国产精品免费久久久久久 | 国产一级一国产一级毛片 | 欧产日产国产精品99 | 成人毛片网 | 欧美黄色试片 | 黄色免费小视频网站 | jizzyouxxxx| 亚洲精品欧美二区三区中文字幕 | 欧美在线观看视频一区二区 | 亚洲日本韩国在线观看 | 能看的毛片网站 | 精品亚洲一区二区三区 | 日韩黄色av网站 | 视频一区二区在线观看 | 成人免费毛片片v | 成人福利免费在线观看 | av中文一区 | 精品国产一级毛片 | 日韩2区 | 日日噜噜噜夜夜狠狠久久蜜桃 | 中文字幕精品一二三四五六七八 | 中文字幕一二三区芒果 | 羞羞视频免费网站日本动漫 | 中国免费一级毛片 | 国产精品免费久久久久 | 精品国产91久久久久久 | 亚洲欧美一区二区三区在线观看 | 麻豆视频国产在线观看 | 国产青草视频在线观看视频 | 精品成人免费 | 369看片你懂的小视频在线观看 | 一级在线免费 | 美女被免费网站在线软件 | 91精品国产91久久久 |