存儲(chǔ)引擎包括存取方法、事務(wù)管理和緩沖區(qū)管理器。 存取方法(Access Methods) SQL Server需要定位數(shù)據(jù)庫(kù)時(shí),會(huì)調(diào)用存取方法代碼。它提供了一組代碼,用來(lái)創(chuàng)建和請(qǐng)求對(duì)數(shù)據(jù)頁(yè)面和索引頁(yè)面進(jìn)行掃描,并且將準(zhǔn)備好的OLE DB數(shù)據(jù)行集返回給關(guān)系引擎。存取方法并不
存儲(chǔ)引擎包括存取方法、事務(wù)管理和緩沖區(qū)管理器。
存取方法(Access Methods)
SQL Server需要定位數(shù)據(jù)庫(kù)時(shí),會(huì)調(diào)用存取方法代碼。它提供了一組代碼,用來(lái)創(chuàng)建和請(qǐng)求對(duì)數(shù)據(jù)頁(yè)面和索引頁(yè)面進(jìn)行掃描,并且將準(zhǔn)備好的OLE DB數(shù)據(jù)行集返回給關(guān)系引擎。存取方法并不真正進(jìn)行操作,它只負(fù)責(zé)向緩沖區(qū)管理器發(fā)出請(qǐng)求。存取方法不僅僅如此,它還會(huì)預(yù)測(cè)哪些數(shù)據(jù)頁(yè)面索引頁(yè)面即將處理,這樣才能保證SQLServer高速處理。
事務(wù)管理器(Transaction Manager)
事務(wù)管理器包括兩個(gè)組件:日志管理器和鎖管理器。
鎖管理器負(fù)責(zé)數(shù)據(jù)的并發(fā)保護(hù)和基于特定隔離級(jí)別的管理。
日志管理器負(fù)責(zé)將事務(wù)日志提前記錄于日志文件中,從而起到保護(hù)數(shù)據(jù)的作用。訪問(wèn)方法代碼請(qǐng)求的所有數(shù)據(jù)更改都必須記入日志中,這種方式稱(chēng)為預(yù)寫(xiě)日志。這是數(shù)據(jù)修改(插入、更新、刪除、分配釋放區(qū)和頁(yè)、創(chuàng)建刪除索引等)唯一總是寫(xiě)磁盤(pán)的的操作。它記錄的是修改操作發(fā)生以后數(shù)據(jù)頁(yè)面發(fā)生的改變,因此我們很難從中發(fā)現(xiàn)有意義的信息。除非用些第三方的工具。
緩沖區(qū)管理器(Buffer Manager)
緩沖區(qū)管理器用來(lái)管理緩沖區(qū)內(nèi)存池中數(shù)據(jù)頁(yè)面的分布。所有對(duì)數(shù)據(jù)的操作,都是先在緩沖區(qū)中操作的。然后由SQLOS中的檢查點(diǎn)或者是惰性寫(xiě)入器同步到磁盤(pán)中。這樣能保證SQLServer更快的響應(yīng)請(qǐng)求。操作完成后就結(jié)果返回給訪問(wèn)方法。
四、緩沖池
緩沖池是SQLServer最消耗內(nèi)存的部分。主要包含執(zhí)行計(jì)劃緩存和數(shù)據(jù)緩存。
五、SQLOS
可以理解為是SQLServer的資源管理器,主要負(fù)責(zé)與操作系統(tǒng)中的一些交互操作。如:內(nèi)存分配、資源調(diào)度、I/O操作、進(jìn)程線程管理以及同步、閂鎖等等。這部分在此不展開(kāi),后期考慮專(zhuān)門(mén)寫(xiě)一章。
三、SQLServer執(zhí)行模型
從圖中可以看出,我這的執(zhí)行模型也說(shuō)的是整個(gè)SQLServer服務(wù)端在接收請(qǐng)求時(shí),要發(fā)生的事情。但是和前面一樣,SQLServer很多時(shí)候很多細(xì)化過(guò)于復(fù)雜沒(méi)有辦法能用一章圖描述清楚。這個(gè)圖簡(jiǎn)單的說(shuō)明了SQLServer的執(zhí)行模型。在分析這個(gè)圖前,要明確一個(gè)問(wèn)題。SQLServer是基于C/S的結(jié)構(gòu)的產(chǎn)品。這樣很明顯就分為客戶(hù)端與服務(wù)端。平時(shí)管理數(shù)據(jù)庫(kù)的MSSMS以及我們需要訪問(wèn)數(shù)據(jù)庫(kù)的系統(tǒng)就是屬于SQLServer的客戶(hù)端,SQLServer服務(wù)端主要是由一些服務(wù)方式構(gòu)成。
因?yàn)槭荂/S,那么客戶(hù)端的所有請(qǐng)求都必須傳輸?shù)椒?wù)端,才能被執(zhí)行。這樣的話就涉及的雙方通信的協(xié)議,這個(gè)協(xié)議在SQLServer2005后,就稱(chēng)為SNI。包的格式就是TDS??蛻?hù)端的TDS通過(guò)SQLServer支持的協(xié)議傳輸?shù)絊QLServer服務(wù)端,服務(wù)端有一個(gè)組件叫連接監(jiān)聽(tīng)服務(wù),它一直在監(jiān)聽(tīng)這請(qǐng)求端口。它負(fù)責(zé)監(jiān)聽(tīng)新的連接,清除失敗連接,將結(jié)果集、消息和狀態(tài)返回給客戶(hù)端。連接監(jiān)聽(tīng)服務(wù)會(huì)把包發(fā)送給協(xié)議層,協(xié)議層對(duì)這個(gè)包進(jìn)行解包,提取里面要執(zhí)行的SQL語(yǔ)句,交給關(guān)系引擎,關(guān)系引擎經(jīng)過(guò)處理后生成執(zhí)行計(jì)劃,并且執(zhí)行計(jì)劃。一旦關(guān)系引擎開(kāi)發(fā)執(zhí)行工作計(jì)劃時(shí),就會(huì)創(chuàng)建任務(wù)對(duì)象。任務(wù)對(duì)象必須關(guān)聯(lián)一個(gè)空閑工作線程。工作線程關(guān)聯(lián)到新任務(wù)后,狀態(tài)設(shè)置為初始化。當(dāng)完成初始化后,工作線程就轉(zhuǎn)成為可運(yùn)行。這時(shí)工作線程就準(zhǔn)備就緒,只要有空閑的調(diào)度器就可以執(zhí)行了。如果執(zhí)行過(guò)程中遇到定時(shí)器等待、請(qǐng)求資源等待、I/O等待就會(huì)掛起移至相應(yīng)的列表中。SQLServer采用了非搶占式調(diào)度。一個(gè)線程會(huì)完成這個(gè)任務(wù)的操作。不存在上下文切換,當(dāng)然如果不是SQLServer的代碼則采用搶占式調(diào)度,比如擴(kuò)展存儲(chǔ)過(guò)程。
今天分析就到此結(jié)束,文中如有描述不當(dāng)?shù)牡胤?,歡迎指出。共同進(jìn)步才是硬道理。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com