大家好,歡迎來(lái)到第1周的SQL Server性能調(diào)優(yōu)培訓(xùn)。在我們進(jìn)入SQL Server性能調(diào)優(yōu)里枯燥難懂的細(xì)節(jié)內(nèi)容之前,我想通過(guò)講解SQL Server如何執(zhí)行一個(gè)查詢來(lái)建立基礎(chǔ)。這個(gè)部分非常重要,因?yàn)榻酉聛?lái)的培訓(xùn)中我們會(huì)以這些概念來(lái)加深我們對(duì)SQL Server的認(rèn)識(shí)。
當(dāng)我們執(zhí)行一個(gè)查詢時(shí),在SQL Server中最重要的組件有哪些,下面這張圖片可以給大家一個(gè)概觀的認(rèn)識(shí)。
可以看到,SQL Server內(nèi)部分成了2個(gè)部分:關(guān)系引擎和存儲(chǔ)引擎。在關(guān)系引擎中最大的一個(gè)組件是查詢優(yōu)化器。查詢優(yōu)化器唯一和僅有的任務(wù)是把我們傳入的查詢語(yǔ)句生成實(shí)際的執(zhí)行計(jì)劃。
讀取數(shù)據(jù)我們提交給SQL Server 的查詢,通過(guò)協(xié)議層傳給命令分析器。命令分析器會(huì)檢查我們是否提供了一個(gè)語(yǔ)法正確的語(yǔ)句,我們所提到的表和列在數(shù)據(jù)庫(kù)里是否存在。命令分析器會(huì)生成可以重現(xiàn)我們查詢的查詢樹(shù)。查詢樹(shù)會(huì)被查詢優(yōu)化器用來(lái)生成執(zhí)行計(jì)劃。
然后編譯后的執(zhí)行計(jì)劃會(huì)提交給查詢執(zhí)行器。查詢執(zhí)行器的任務(wù)是執(zhí)行執(zhí)行計(jì)劃。但是為了以后的重用,首先它會(huì)把編譯好的執(zhí)行計(jì)劃放在執(zhí)行計(jì)劃緩存區(qū)進(jìn)行緩存。在SQL Server 中計(jì)劃緩存是個(gè)強(qiáng)大同時(shí)又是一個(gè)非常危險(xiǎn)的概念。我們會(huì)在第10周討論計(jì)劃緩存的時(shí)學(xué)到更多的細(xì)節(jié)。
執(zhí)行計(jì)劃被緩存后,查詢執(zhí)行器與存儲(chǔ)引擎進(jìn)行互動(dòng),并在執(zhí)行計(jì)劃里執(zhí)行每個(gè)操作。當(dāng)我們?cè)趫?zhí)行計(jì)劃里訪問(wèn)數(shù)據(jù)時(shí),存取方法會(huì)向緩沖區(qū)管理器讀取我們想要指定頁(yè)。下周我們將討論SQL Server中頁(yè)的更多細(xì)節(jié)。現(xiàn)在你只要知道頁(yè)是8Kb的緩存,在那里存放著我們的表和索引數(shù)據(jù)。緩沖管理器管理著緩沖池(緩沖池包含執(zhí)行計(jì)劃緩存區(qū)和數(shù)據(jù)緩存區(qū)),那里存放著我們8kb大小的頁(yè)。緩沖池是SQL Server的主要內(nèi)存消耗,它的大小我們可以通過(guò)服務(wù)器屬性->內(nèi)存->最小、最大服務(wù)器內(nèi)存(MB)來(lái)配置。
當(dāng)請(qǐng)求的頁(yè)面已經(jīng)被存在緩沖池時(shí),頁(yè)會(huì)被立即讀取。在SQL Server里這個(gè)被稱為邏輯讀。如果請(qǐng)求的頁(yè)沒(méi)存在緩沖池,緩沖區(qū)管理器會(huì)發(fā)起異步I/O操作把請(qǐng)求的頁(yè)從我們的存儲(chǔ)子系統(tǒng)中讀到緩沖池,這個(gè)被稱為物理讀。在異步I/O操作期間,我們的查詢需要一直等到操作結(jié)束才繼續(xù)。在第22周我們會(huì)討論等待和等待統(tǒng)計(jì)的更多細(xì)節(jié)。
一旦頁(yè)被讀取到緩沖池,頁(yè)會(huì)被請(qǐng)求的訪問(wèn)方法取走。當(dāng)執(zhí)行計(jì)劃執(zhí)行完成后,產(chǎn)生的數(shù)據(jù)會(huì)通過(guò)協(xié)議層返回給提交查詢的程序。
修改數(shù)據(jù)當(dāng)我們與使用修改數(shù)據(jù)的TSQL語(yǔ)句(INSERT,UPDATE,DELETE,MERGE)打交道時(shí),存儲(chǔ)引擎同樣與事務(wù)管理器進(jìn)行交互。事務(wù)管理器把執(zhí)行事務(wù)中描述我們所做的改變通過(guò)事務(wù)日志寫(xiě)到事務(wù)文件。當(dāng)這些日志記錄寫(xiě)好后,事務(wù)就可以提交了。事務(wù)執(zhí)行有多快,你的數(shù)據(jù)修改就有多快。
在內(nèi)存中被修改的頁(yè)通過(guò)稱為檢查點(diǎn)過(guò)程寫(xiě)回存儲(chǔ)子系統(tǒng)。默認(rèn)情況下,檢查點(diǎn)每一分鐘從緩沖區(qū)管理器請(qǐng)求所有的臟頁(yè)并執(zhí)行一次。臟頁(yè)就是在內(nèi)存里被修改,但還沒(méi)有寫(xiě)回存儲(chǔ)的。一旦臟頁(yè)被寫(xiě)回存儲(chǔ),這個(gè)頁(yè)就會(huì)被標(biāo)記為干凈頁(yè)。
小結(jié)從上面的描述我們可以看到,當(dāng)你執(zhí)行一個(gè)SQL語(yǔ)句查詢時(shí),SQL Server里面發(fā)生了很多不同的事情。如果你想了解更多SQL Server里各個(gè)組件間的相互操作,我強(qiáng)烈推薦看下SQL Server團(tuán)隊(duì)成員Remus Rusanu這個(gè)帖子http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/。(注中文版:SQL Server 2012:SQL Server體系結(jié)構(gòu)——一個(gè)查詢的生命周期(第1部分),(第2部分),(第3部分)。
上面提到的各個(gè)組件如果出現(xiàn)問(wèn)題,都會(huì)觸發(fā)SQL Server的性能問(wèn)題,這些問(wèn)題最后都要靠你來(lái)解決。下周我們見(jiàn)到的時(shí)候,將一起討論下SQL Server中的頁(yè)。
新聞熱點(diǎn)
疑難解答
圖片精選