select查詢原理

2022-08-28 00:15:13 字數 3465 閱讀 4107

我並非專業

dba,

但做為b/s

架構的開發人員

,總是離不開資料庫

,一般開發員只會應用

sql的四條經典語句

:select ,insert,delete,update

。但是我從來沒有研究過它們的工作原理

,這篇我想說一說

select

在資料庫中的工作原理。

b/s架構中最經典的話題無非於三層架構

,可以大概分為資料層

,業務邏輯層和表示層

,而資料層的作用一般都是和資料庫互動

,例如查詢記錄。

我們經常是寫好查詢

sql,

然後呼叫程式執行

sql。但是它內部的工作流程是怎樣的呢?先做哪一步,然後做哪一步等

,我想還有大部分朋友和我一樣都不一定清楚。 

第一步:應用程式把查詢

sql語句發給伺服器端執行。

我們在資料層執行

sql語句時

,應用程式會連線到相應的資料庫伺服器,把

sql語句傳送給伺服器處理。

第二步:伺服器解析請求的

sql語句。

1:sql

計畫快取

,經常用查詢分析器的朋友大概都知道這樣乙個事實

,往往乙個查詢語句在第一次執行的時候需要執行特別長的時間

,但是如果你馬上或者在一定時間內執行同樣的語句

,會在很短的時間內返回查詢結果。  原因:

1):伺服器在接收到查詢請求後

,並不會馬上去資料庫查詢

,而是在資料庫中的計畫快取中找是否有相對應的執行計畫

,如果存在

,就直接呼叫已經編譯好的執行計畫

,節省了執行計畫的編譯時間。

2):如果所查詢的行已經存在於資料緩衝儲存區中

,就不用查詢物理檔案了

,而是從快取中取資料

,這樣從記憶體中取資料就會比從硬碟上讀取資料快很多

,提高了查詢效率

.資料緩衝儲存區會在後面提到。

2:如果在

sql計畫快取中沒有對應的執行計畫

,伺服器首先會對使用者請求的

sql語句進行語法效驗

,如果有語法錯誤

,伺服器會結束查詢操作

,並用返回相應的錯誤資訊給呼叫它的應用程式。注意:

此時返回的錯誤資訊中

,只會包含基本的語法錯誤資訊,例如

select

寫成selec等,

錯誤資訊中如果包含一列表中本沒有的列

,此時伺服器是不會檢查出來的

,因為只是語法驗證

,語義是否正確放在下一步進行。

3:語法符合後

,就開始驗證它的語義是否正確,例如

,表名,列名

,儲存過程等等資料庫物件是否真正存在

,如果發現有不存在的

,就會報錯給應用程式

,同時結束查詢。

4:接下來就是獲得物件的解析鎖

,我們在查詢乙個表時

,首先伺服器會對這個物件加鎖

,這是為了保證資料的統一性

,如果不加鎖

,此時有資料插入

,但因為沒有加鎖的原因

,查詢已經將這條記錄讀入

,而有的插入會因為事務的失敗會回滾

,就會形成髒讀的現象。

5:接下來就是對資料庫使用者許可權的驗證

,sql

語句語法

,語義都正確

,此時並不一定能夠得到查詢結果

,如果資料庫使用者沒有相應的訪問許可權

,伺服器會報出許可權不足的錯誤給應用程式

,在稍大的專案中

,往往乙個專案裡面會包含好幾個資料庫連線串

,這些資料庫使用者具有不同的許可權

,有的是唯讀許可權

,有的是只寫許可權

,有的是可讀可寫

,根據不同的操作選取不同的使用者來執行

,稍微不注意

,無論你的

sql語句寫的多麼完善

,完美無缺都沒用。

6:解析的最後一步

,就是確定最終的執行計畫。當語法,語義

,許可權都驗證後

,伺服器並不會馬上給你返回結果

,而是會針對你的

sql進行優化

,選擇不同的查詢演算法以最高效的形式返回給應用程式。例如在做表聯合查詢時

,伺服器會根據開銷成本來最終決定採用

hash join,merge join ,

還是loop join,

採用哪乙個索引會更高效等等

,不過它的自動化優化是有限的

,要想寫出高效的查詢

sql還是要優化自己的

sql查詢語句。

當確定好執行計畫後

,就會把這個執行計畫儲存到

sql計畫快取中

,下次在有相同的執行請求時

,就直接從計畫快取中取

,避免重新編譯執行計畫。

第三步:語句執行。

伺服器對

sql語句解析完成後

,伺服器才會知道這條語句到底表態了什麼意思

,接下來才會真正的執行

sql語句。

些時分兩種情況

:1):

如果查詢語句所包含的資料行已經讀取到資料緩衝儲存區的話

,伺服器會直接從資料緩衝儲存區中讀取資料返回給應用程式

,避免了從物理檔案中讀取

,提高查詢速度。

2):如果資料行沒有在資料緩衝儲存區中

,則會從物理檔案中讀取記錄返回給應用程式

,同時把資料行寫入資料緩衝儲存區中

,供下次使用。

說明:sql

快取分好幾種

,這裡有興趣的朋友可以去搜尋一下

,有時因為快取的存在

,使得我們很難馬上看出優化的結果

,因為第二次執行因為有快取的存在

,會特別快速

,所以一般都是先消除快取

,然後比較優化前後的效能表現

,這裡有幾個常用的方法

:dbcc dropcleanbuffers

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

dbcc freeproccache

從過程快取中刪除所有元素。

dbcc freesystemcache

從所有快取中釋放所有未使用的快取條目。

sql server 2005

資料庫引擎會事先在後台清理未使用的快取條目,以使記憶體可用於當前條目。但是,可以使用此命令從所有快取中手動刪除未使用的條目。

這只能基本消除

sql快取的影響

,目前好像沒有完全消除快取的方案

,如果大家有

,請指教。結論:

只有知道了服務執行應用程式提交的

sql的操作流程才能很好的除錯我們的應用程式。

1:確保

sql語法正確;2:

確保sql

語義上的正確性

,即物件是否存在;3:

資料庫使用者是否具有相應的訪問許可權。

select查詢原理

select查詢原理 我並非專業dba,但做為b s架構的開發人員,總是離不開資料庫,一般開發員只會應用sql的四條經典語句 select insert,delete,update。但是我從來沒有研究過它們的工作原理,這篇我想說一說select在資料庫中的工作原理。b s架構中最經典的話題無非於三層...

select查詢原理

我並非專業dba,但做為b s架構的開發人員,總是離不開資料庫,一般開發員只會應用sql的四條經典語句 select insert,delete,update。但是我從來沒有研究過它們的工作原理,這篇我想說一說select在資料庫中的工作原理。b s架構中最經典的話題無非於三層架構,可以大概分為資料...

select查詢原理

我並非專業dba,但做為b s架構的開發人員,總是離不開資料庫,一般開發員只會應用sql的四條經典語句 select insert,delete,update。但是我從來沒有研究過它們的工作原理,這篇我想說一說select在資料庫中的工作原理。b s架構中最經典的話題無非於三層架構,可以大概分為資料...