第1/24周 SQL Server 如何執行一個查詢


        大家好,歡迎來到第1周的SQL Server性能調優培訓。在我們進入SQL Server性能調優里枯燥難懂的細節內容之前,我想通過講解SQL Server如何執行一個查詢來建立基礎。這個部分非常重要,因為接下來的培訓中我們會以這些概念來加深我們對SQL Server的認識。

當我們執行一個查詢時,在SQL Server中最重要的組件有哪些,下面這張圖片可以給大家一個概觀的認識。

        可以看到,SQL Server內部分成了2個部分:關系引擎存儲引擎關系引擎中最大的一個組件是查詢優化器。查詢優化器唯一和僅有的任務是把我們傳入的查詢語句生成實際的執行計划。

 

讀取數據

        我們提交給SQL Server 的查詢,通過協議層傳給命令分析器。命令分析器會檢查我們是否提供了一個語法正確的語句,我們所提到的表和列在數據庫里是否存在。命令分析器會生成可以重現我們查詢的查詢樹。查詢樹會被查詢優化器用來生成執行計划。

        然后編譯后的執行計划會提交給查詢執行器。查詢執行器的任務是執行執行計划。但是為了以后的重用,首先它會把編譯好的執行計划放在執行計划緩存區進行緩存。在SQL Server 中計划緩存是個強大同時又是一個非常危險的概念。我們會在第10周討論計划緩存的時學到更多的細節。

        執行計划被緩存后,查詢執行器與存儲引擎進行互動,並在執行計划里執行每個操作。當我們在執行計划里訪問數據時,存取方法會向緩沖區管理器讀取我們想要指定頁。下周我們將討論SQL Server中頁的更多細節。現在你只要知道頁是8Kb的緩存,在那里存放着我們的表和索引數據。緩沖管理器管理着緩沖池(緩沖池包含執行計划緩存區和數據緩存區),那里存放着我們8kb大小的頁。緩沖池是SQL Server的主要內存消耗,它的大小我們可以通過服務器屬性->內存->最小、最大服務器內存(MB)來配置。

        當請求的頁面已經被存在緩沖池時,頁會被立即讀取。在SQL Server里這個被稱為邏輯讀如果請求的頁沒存在緩沖池,緩沖區管理器會發起異步I/O操作把請求的頁從我們的存儲子系統中讀到緩沖池,這個被稱為物理讀。在異步I/O操作期間,我們的查詢需要一直等到操作結束才繼續。在第22周我們會討論等待等待統計的更多細節。

        一旦頁被讀取到緩沖池,頁會被請求的訪問方法取走。當執行計划執行完成后,產生的數據會通過協議層返回給提交查詢的程序。  

 

修改數據

當我們與使用修改數據的TSQL語句(INSERT,UPDATE,DELETE,MERGE)打交道時,存儲引擎同樣與事務管理器進行交互。事務管理器把執行事務中描述我們所做的改變通過事務日志寫到事務文件。當這些日志記錄寫好后,事務就可以提交了。事務執行有多快,你的數據修改就有多快。

在內存中被修改的頁通過稱為檢查點過程寫回存儲子系統。默認情況下,檢查點每一分鍾從緩沖區管理器請求所有的臟頁並執行一次。臟頁就是在內存里被修改,但還沒有寫回存儲的。一旦臟頁被寫回存儲,這個頁就會被標記為干凈頁。

小結

從上面的描述我們可以看到,當你執行一個SQL語句查詢時,SQL Server里面發生了很多不同的事情。如果你想了解更多SQL Server里各個組件間的相互操作,我強烈推薦看下SQL Server團隊成員Remus Rusanu這個帖子http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/。(注中文版:SQL Server 2012:SQL Server體系結構——一個查詢的生命周期(第1部分),(第2部分),(第3部分)。

上面提到的各個組件如果出現問題,都會觸發SQL Server的性能問題,這些問題最后都要靠你來解決。下周我們見到的時候,將一起討論下SQL Server中的

圍觀PPT:

0420_01_SQL_SERVER如何執行一個查詢.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM