了解SQL Server 內(nèi)部組件是如何運(yùn)作對(duì)學(xué)習(xí)BI是非常有幫助的,它是BI數(shù)據(jù)的主要來源犁珠。
?????? 一:SQL Server 網(wǎng)絡(luò)接口(SNI)是一個(gè)協(xié)議層逻炊,負(fù)責(zé)建立客戶端和服務(wù)器之間的網(wǎng)絡(luò)連接。SQL Server支持的協(xié)議有:共享內(nèi)存犁享、TCP/IP余素、命名管道 等,這里我講一下 TCP 協(xié)議的三次握手和四次揮手炊昆,TCP端口默認(rèn)1433桨吊,UDP端口默認(rèn)1434
二:SQL Server 由兩個(gè)主要引擎組成:關(guān)系引擎和存儲(chǔ)引擎。
?????? 關(guān)系引擎有時(shí)稱為查詢處理器凤巨,因?yàn)殛P(guān)系引擎的主要功能是進(jìn)行查詢的優(yōu)化和執(zhí)行视乐。關(guān)系引擎包含三個(gè)主要部分,命令解析器磅甩、查詢優(yōu)化器和查詢執(zhí)行器炊林。命令解析器用于檢查查詢命令的語(yǔ)法和生成查詢樹,查詢優(yōu)化器大概是任何數(shù)據(jù)庫(kù)系統(tǒng)中最重要的一部分卷要,查詢執(zhí)行器負(fù)責(zé)查詢命令的執(zhí)行渣聚。
?????? 存儲(chǔ)引擎負(fù)責(zé)管理與數(shù)據(jù)相關(guān)的所有I/O操作拍顷,包括訪問方法和緩沖區(qū)管理器租悄。其中,訪問方法負(fù)責(zé)處理行岸夯、索引瓶堕、頁(yè)隘道、分配和行版本的I/O請(qǐng)求;緩沖區(qū)管理器負(fù)責(zé)緩沖池的管理郎笆,緩沖池是SQL Server 內(nèi)存的主要使用者谭梗。存儲(chǔ)引擎還包含了一個(gè)事物管理器,負(fù)責(zé)數(shù)據(jù)的鎖定以實(shí)現(xiàn)ACID(原子性宛蚓、一致性激捏、隔離性、持久性)屬性中的隔離性凄吏,并負(fù)責(zé)管理事物日志远舅。
?????? 緩沖池是SQL Server內(nèi)存最大的使用者闰蛔。緩沖池中包含了SQL Server 中所有類型的緩存,包括計(jì)劃緩存和數(shù)據(jù)緩存图柏。比如當(dāng)你查詢一個(gè)關(guān)聯(lián)語(yǔ)句時(shí)如果它開機(jī)后沒有執(zhí)行過序六,查詢時(shí)會(huì)消耗一點(diǎn)時(shí)間,如果開機(jī)后又查詢過在去查詢速度會(huì)很快蚤吹,它沒有去查詢數(shù)據(jù)庫(kù)文件而是去的內(nèi)存中緩存下來的數(shù)據(jù)例诀。
三:磁盤上的數(shù)據(jù)文件和日志文件。
這里已一個(gè)簡(jiǎn)單的查詢(select)和更新(update)的生命周期為例
簡(jiǎn)單的查詢
[if !supportLists]1.????[endif]客戶端的SQL Server 網(wǎng)絡(luò)接口(SNI)通過只用網(wǎng)絡(luò)協(xié)議裁着,例如TCP/IP與SQL Server服務(wù)器端的SNI建立了一個(gè)連接余佃,然后通過TCP/IP連接和TDS端點(diǎn)創(chuàng)建一個(gè)連接,并通過這個(gè)連接向SQL Server以TDS消息的形式發(fā)送select語(yǔ)句跨算。
[if !supportLists]2.????[endif]SQL Server的SNI將TDS消息解包,讀取select語(yǔ)句椭懊,然后將這個(gè)SQL命令發(fā)送給命令解析器诸蚕。
[if !supportLists]3.????[endif]命令解析器在緩沖池的計(jì)劃緩存中檢查是否已經(jīng)存在了一條與接收到的語(yǔ)句匹配且可用的查詢計(jì)劃。如果找不到命令解析器則基于select語(yǔ)句生成一個(gè)查詢樹氧猬,然后將查詢樹傳遞給查詢優(yōu)化器背犯,讓它生成查詢計(jì)劃。
[if !supportLists]4.????[endif]由于這條查詢命令比較簡(jiǎn)單盅抚,查詢優(yōu)化器僅在預(yù)優(yōu)化階段就生成了“零開銷”的查詢計(jì)劃(或稱為“普通”查詢計(jì)劃)漠魏。查詢優(yōu)化器將創(chuàng)建出來的查詢計(jì)劃發(fā)送給查詢執(zhí)行器執(zhí)行。
[if !supportLists]5.????[endif]查詢執(zhí)行器在執(zhí)行查詢計(jì)劃的時(shí)候妄均,首先確定完成這個(gè)查詢計(jì)劃需要讀取什么數(shù)據(jù)柱锹,然后通過OLE DB 接口向存儲(chǔ)引擎中的訪問方法發(fā)送訪問請(qǐng)求。
[if !supportLists]6.????[endif]為了完成查詢執(zhí)行器的請(qǐng)求丰包,訪問方法需要從數(shù)據(jù)庫(kù)中讀取一個(gè)數(shù)據(jù)頁(yè)面禁熏,并要求緩沖區(qū)管理器提供這個(gè)數(shù)據(jù)頁(yè)面。
[if !supportLists]7.????[endif]緩沖區(qū)管理器在數(shù)據(jù)緩存中檢查這個(gè)數(shù)據(jù)頁(yè)是否已經(jīng)存在邑彪。由于這個(gè)頁(yè)面并沒有在緩存中瞧毙,因此緩沖區(qū)管理器首先從磁盤上獲取這個(gè)數(shù)據(jù)頁(yè)面,然后將其存入緩存寄症,并傳回給訪問方法宙彪。
[if !supportLists]8.????[endif]最后,訪問方法將結(jié)果集傳遞給關(guān)系引擎有巧,由關(guān)系引擎將結(jié)果集發(fā)送給客戶端释漆。
商業(yè)智能入門基礎(chǔ):http://www.51zxw.net/list.aspx?cid=610
簡(jiǎn)單的更新
?????? 更新與查詢的前面步驟是一樣的,到了訪問方法這一步剪决,事物管理器會(huì)將更新操作寫入日志管理器中灵汪,只有在確定操作已經(jīng)成功寫入了事物日志之后檀训,才能夠執(zhí)行真正的數(shù)據(jù)修改操作。所以事物日志的性能很關(guān)鍵享言,一旦訪問方法接收到確認(rèn)信息峻凫,就將修改數(shù)據(jù)的請(qǐng)求發(fā)送給緩沖區(qū)管理器,由緩沖區(qū)管理器完成修改數(shù)據(jù)的操作览露。