資源描述:
《sqlserver內(nèi)核架構(gòu)剖析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、SQLServer內(nèi)核架構(gòu)剖析>>教育資源庫 我們做管理軟件的,主要核心就在數(shù)據(jù)存儲(chǔ)管理上。所以數(shù)據(jù)庫設(shè)計(jì)是我們的重中之重。為了讓我們的管理軟件能夠穩(wěn)定、可擴(kuò)展、性能優(yōu)秀、可跟蹤排錯(cuò)、可升級(jí)部署、可插件運(yùn)行,我們往往研發(fā)自己的管理軟件開發(fā)平臺(tái)。我們總是希望去學(xué)習(xí)別人的開發(fā)平臺(tái)(如用友或金蝶或SAP),但我們卻總是感嘆管理軟件業(yè)務(wù)處理細(xì)節(jié)繁多,而數(shù)據(jù)庫管理軟件卻簡單的SELECT、INSERT、DELETE、UPDATE四個(gè)命令就搞定。我們多希望有一天能做出一個(gè)架構(gòu),也可以這么簡單就搞定管理軟件。我們往往研究別人的架構(gòu),卻忘記了我們身邊
2、我們最熟悉的數(shù)據(jù)庫的架構(gòu)。所以,今天,我想帶領(lǐng)大家一起剖析一下數(shù)據(jù)庫的架構(gòu),來探索數(shù)據(jù)庫的架構(gòu)思想。而我本人呢,只熟悉SQLSERVER這一種數(shù)據(jù)庫產(chǎn)品,所以我就拿SQLSERVER來分析。 在講SQLSERVER內(nèi)部原理的之前,我覺得非常有必要向大家介紹一下SQLSERVER的歷史。 讓我們站在1999年,看看計(jì)算機(jī)數(shù)據(jù)庫業(yè)界到底處于什么狀態(tài)?! ?999年,Oracle已經(jīng)于1998年9月發(fā)布了Oracle8i(可能中文版在1999年才來到中國)。Oracle8i支持用JAVA編寫存儲(chǔ)過程,支持XML,支持Linux。 199
3、9年1月,SQLSERVER7正式發(fā)布。SQLSERVER7重構(gòu)了整個(gè)數(shù)據(jù)庫引擎(相當(dāng)于重寫了SQLSERVER)。SQLSERVER第一次完整性的支持了行鎖(有沒有搞錯(cuò),過去人是怎么使用數(shù)據(jù)庫產(chǎn)品的。1988年,Oracle6就支持行鎖。另外1988年,Oracle就開始研發(fā)ERP產(chǎn)品。誰說Oracle是ERP門外漢,可以參考這個(gè))。 看看他們倆的前一個(gè)版本。如果你入行比較晚(2000年以后),可能對以下文字更感到驚訝?! ?992年,Oracle7發(fā)布。有了存儲(chǔ)過程、觸發(fā)器、引用完整性校驗(yàn)、分布式事務(wù)處理。(天哪,Oracle7才
4、有了這些東西)?! ?995年,SQLSERVER6發(fā)布。SQLSERVER6是微軟真正意義上的第一個(gè)數(shù)據(jù)庫產(chǎn)品(真是爆料,大家沒想到SQLSERVER6才是微軟第一個(gè)數(shù)據(jù)庫產(chǎn)品,那版本6之前的5、4、3、2、1是怎么度過的)。因?yàn)?994年,微軟和Sybase掰了(Sybase是第一個(gè)運(yùn)行于PC上的C/S數(shù)據(jù)庫產(chǎn)品)。微軟為了進(jìn)入數(shù)據(jù)庫產(chǎn)品領(lǐng)域,自己又沒有經(jīng)驗(yàn),于是和Sybase一起合作(當(dāng)時(shí)微軟是全世界第一大軟件公司,微軟1986年上市。Sybase有產(chǎn)品,缺錢。微軟缺產(chǎn)品,有錢。于是一拍即合)。直到1994年,微軟也不需要Syba
5、se了(已經(jīng)學(xué)會(huì)了數(shù)據(jù)庫技術(shù)),Sybase也感覺微軟太狼子野心,于是合作分裂。微軟開始自己做自己的數(shù)據(jù)庫?! v史說完。我們言歸正傳。 很多入門級(jí)做管理軟件的,SQL語句玩的熟練,從子查詢到Having到交叉表統(tǒng)計(jì)SQL都能做出來,甚至存儲(chǔ)過程能寫2000多行,游標(biāo)、自定義函數(shù)、觸發(fā)器、約束用的眼花繚亂。再入點(diǎn)門,在SQL查詢器中可以使用SQL分析優(yōu)化索引,用SQLProfile可以跟蹤SQL,甚至在性能查看器中監(jiān)測SQLSERVER內(nèi)存、CPU、線程、I/O的運(yùn)行狀態(tài),甚至為自己會(huì)使用DBCC而沾沾自喜?! ∧闶侨绱耸煜QLSE
6、RVER,又是對SQLSERVER如此陌生?! ∥医裉炀陀眉軜?gòu)的角度來給大家分析一下SQLSERVER架構(gòu)和原理。短短一篇博文肯定只能面上的多一些,深一層的可能需要連載數(shù)篇文章甚至一塊大磚頭書才能講完整。不過,我希望我的博文能夠拋磚引玉,使大家能從一個(gè)過去沒有想過的角度去看SQLSERVER?! QLSERVER,作為一個(gè)數(shù)據(jù)庫產(chǎn)品,我個(gè)人認(rèn)為,最重要的就是兩大塊:存儲(chǔ)引擎和查詢引擎?! ∑渌娜罩尽⑹聞?wù)、鎖、索引等等都是圍繞他們來工作的?! QLSERVER是C/S產(chǎn)品,所以一條SQL語句要讓SQLSERVER執(zhí)行,必須要傳輸?shù)絊
7、QLSERVER服務(wù)器端。傳輸,我們當(dāng)然知道需要NetBEUI、TCP/IP等等網(wǎng)絡(luò)傳輸協(xié)議。但是光有這些還不行。客戶端如何發(fā),服務(wù)器端如何收,如何確認(rèn)發(fā)的和收的正確完整,如何確實(shí)發(fā)的和收的已經(jīng)結(jié)束,如何發(fā)和收能跨越各種網(wǎng)絡(luò)協(xié)議(如UNIX和。這個(gè)數(shù)據(jù)流是令牌控制客戶端和服務(wù)器端對話(否則,客戶端說了N句話,服務(wù)器端返回N句話,沒有令牌就混在一起了,不知道哪個(gè)回答是對應(yīng)哪個(gè)請求的)。我們往往不能直接和OpenDataServices打交道,把數(shù)據(jù)放進(jìn)來。而是我們必須通過ODBC、ADO或DB-Library來發(fā)送tabulardatas
8、tream。而SQLSERVER返回的數(shù)據(jù)結(jié)果,也是通過這些ODBC之類發(fā)回tabulardatastream。你看看SQLSERVER設(shè)計(jì)的多巧妙,一個(gè)通用數(shù)據(jù)訪問接口屏蔽了你和SQLSERVER之間,就