新聞中心
也許你不需要了解SQL Server的內(nèi)部機制,你照樣能完成CRUD,而且可能完成的還不錯,也許你不需要研究SQL Server的架構(gòu)設(shè)計,你照樣可以根據(jù)自己參與的項目經(jīng)驗設(shè)計出自己需要的架構(gòu),也許你會說不斷的需求變化已經(jīng)把自己的精力耗盡,也許你會說針對項目目前的情況不需要對SQL Server有較深的了解,也許你還會說我喜歡研究某某公司某產(chǎn)品,也許你還會覺得SQL Server太過龐大無從下手……

公司主營業(yè)務(wù):做網(wǎng)站、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出眉山免費做網(wǎng)站回饋大家。
但是總有些問題遲早會促使我們(以SQL Server為主要存儲數(shù)據(jù)容器的開發(fā)人員)開始踏上研究SQL Server的。比如你的數(shù)據(jù)庫隨著數(shù)據(jù)量增長性能越來越慢;再比如你的數(shù)據(jù)庫經(jīng)常莫名其妙掛掉;再比如你照著網(wǎng)絡(luò)或者書籍上的各種清單優(yōu)化和學(xué)習(xí)數(shù)據(jù)庫時,發(fā)現(xiàn)他們很多地方不可靠;再比如你在做sql語句優(yōu)化時你會發(fā)現(xiàn)對很多SQL Server輸出信息不明白具體的意思…等等這些都再向你傳遞一個信息,你需要擦亮自己的眼睛去系統(tǒng)深入的學(xué)習(xí)SQL Server。而不是瞇著眼睛簡單了解一下。
有位朋友寫的一篇<<程序員是否需要底層知識>>,其中有句盡量去打開身邊的盒子,覺得很有道理。研究SQL Server后你會發(fā)現(xiàn)原來我們身邊有設(shè)計這么好的產(chǎn)品值得我們研究。下面簡單的從SQL Server產(chǎn)品結(jié)構(gòu)、SQL Server數(shù)據(jù)庫引擎結(jié)構(gòu)、SQL Server執(zhí)行模型三方面整體介紹一下SQL Server。
一、SQL Server2008產(chǎn)品結(jié)構(gòu)
介紹這部分的主要原因是,總能發(fā)現(xiàn)不少人對SQL Server產(chǎn)品沒有整體的了解。下面部分主要是照搬msdn,其中一部分加了自己的理解。在介紹之前有必要說下OLAP與OLTP。OLTP,聯(lián)機事務(wù)處理。這是大部分基于數(shù)據(jù)庫的項目中用到的。主要記錄系統(tǒng)的具體交易事務(wù)。OLAP,聯(lián)機分析處理。 這個經(jīng)常是和BI密切相關(guān),簡單理解這是BI的的核心技術(shù)之一。下面的Analysis Services、Integration Services都屬于OLAP范疇。
數(shù)據(jù)庫引擎是用于存儲、處理和保護數(shù)據(jù)的核心服務(wù)。數(shù)據(jù)庫引擎提供了受控訪問和快速事務(wù)處理,以滿足企業(yè)內(nèi)最苛刻的數(shù)據(jù)消費應(yīng)用程序的要求。數(shù)據(jù)庫引擎還提供了大量的支持以保持高可用性。這個組件可以說是SQL Server最核心最底層的部分,其他組件都依賴于數(shù)據(jù)庫引擎。
多維數(shù)據(jù)允許您設(shè)計、創(chuàng)建和管理包含從其他數(shù)據(jù)源(如關(guān)系數(shù)據(jù)庫)聚合的數(shù)據(jù)的多維結(jié)構(gòu),從而實現(xiàn)對 OLAP 的支持。當然你可以不需要使用這個組件也能實現(xiàn)多維數(shù)據(jù),但是它讓你更加方便有效。
數(shù)據(jù)挖掘使您可以設(shè)計、創(chuàng)建和可視化數(shù)據(jù)挖掘模型。通過使用多種行業(yè)標準數(shù)據(jù)挖掘算法,可以基于其他數(shù)據(jù)源構(gòu)造這些挖掘模型。通過這個組件,可以方便你從數(shù)據(jù)中得到對于企業(yè)決策有效的信息。
Integration Services 是一個生成高性能數(shù)據(jù)集成解決方案的平臺,其中包括對數(shù)據(jù)倉庫提供提取、轉(zhuǎn)換和加載 (ETL) 處理的包。
復(fù)制是一組技術(shù),用于在數(shù)據(jù)庫間復(fù)制和分發(fā)數(shù)據(jù)和數(shù)據(jù)庫對象,然后在數(shù)據(jù)庫間進行同步操作以維持一致性。使用復(fù)制時,可以通過局域網(wǎng)和廣域網(wǎng)、撥號連接、無線連接和 Internet,將數(shù)據(jù)分發(fā)到不同位置以及分發(fā)給遠程用戶或移動用戶??梢杂迷趍aster-slave的設(shè)計中。
Reporting Services 提供企業(yè)級的 Web 報表功能,從而使您可以創(chuàng)建從多個數(shù)據(jù)源提取數(shù)據(jù)的表,發(fā)布各種格式的表,以及集中管理安全性和訂閱。
Service Broker 幫助開發(fā)人員生成安全的可縮放數(shù)據(jù)庫應(yīng)用程序。這一新的數(shù)據(jù)庫引擎技術(shù)提供了一個基于消息的通信平臺,從而使獨立的應(yīng)用程序組件可作為一個工作整體來執(zhí)行。Service Broker 包括可用于異步編程的基礎(chǔ)結(jié)構(gòu),該結(jié)構(gòu)可用于單個數(shù)據(jù)庫或單個實例中的應(yīng)用程序,也可用于分布式應(yīng)用程序。
#p#
二、SQL Server2008數(shù)據(jù)庫引擎結(jié)構(gòu)
很明顯數(shù)據(jù)庫引擎很復(fù)雜,很多細節(jié)需要我們花很多精力去研究。這篇文章按照標題的意思,大致介紹下:
一、協(xié)議層(Protocol Layer)
當一個應(yīng)用程序與SQL Server數(shù)據(jù)庫引擎通訊時,協(xié)議層提供的應(yīng)用程序編程接口利用微軟自定義的tabular data stream(TDS)package來規(guī)范通訊格式。這一層的意義在于向應(yīng)用程序提供訪問SQL Server的接口。
SQL Server Network Interface(簡稱SNI)
SNI是在服務(wù)器和客戶端之間建立網(wǎng)絡(luò)連接的一種協(xié)議,他提供一組在數(shù)據(jù)庫引擎和SQL Server客戶端使用的API函數(shù)。SNI代替了SQL Server2000下的Net- Libraries組件和MDAC組件。主要是因為MDAC是隨著Windows一起發(fā)布的,SQL Server小組在研發(fā)SQL Server2005后期去協(xié)調(diào)Windows中的MDAC是一件頭疼的事情。所以他們決定SNI的解決方案,這意味這部分代碼隨著SQL Server一起發(fā)布。SQL Server支持共享內(nèi)存(Shared memory)、TCP/IP、命名管道(Named Pipes)、虛擬接口適配器(Virtual Interface Adapter,即VIA)四種協(xié)議。一旦建立連接,SNI就會向服務(wù)器的TDS斷點創(chuàng)建一條安全的連接,用來進行數(shù)據(jù)的請求和返回。
表格格式數(shù)據(jù)流端點(Tabular Data Stream,簡稱TDS)
TDS是一種微軟具有自主知識產(chǎn)權(quán)的協(xié)議,原本是Sybase設(shè)計的。SQL Server在安裝時為其支持的四種協(xié)議各創(chuàng)建一個端點,如果協(xié)議被激活,那么所有用戶均可以使用這個協(xié)議。此外還有一個專門為專用管理員連接(DAC)而設(shè)置的端點。一條SQL語句則會通過TCP/IP連接以TDS消息的形式發(fā)送給SQL Server。
協(xié)議層(Protocol Layer)
一旦協(xié)議層接收到TDS包,就會在反轉(zhuǎn)和解包工作,以找到所包含的請求。協(xié)議層也負責打包結(jié)果和狀態(tài)消息,并以TDS消息的形式返回客戶端。
二、關(guān)系引擎(Relational Engine)
關(guān)系引擎又成為查詢處理器,包括用來確定某個查詢所要做的操作及進行這些操作最佳方式的SQL Server組件。同時關(guān)系引擎也負責向存儲引擎請求數(shù)據(jù)時查詢的執(zhí)行,并處理返回的結(jié)果。
命令分析器(Cmd Parser)
命令分析器處理發(fā)送給SQL Server的T-SQL語言事件。它會先檢查T-SQL語法,并返回任何錯誤信息客戶端,如果語法有效,就會進一步產(chǎn)生執(zhí)行計劃或者去查找一個已經(jīng)存在的執(zhí)行計劃。命令解析器通過T-SQL哈希值向位于緩沖池中的Plan Cache發(fā)出匹配要求,以檢查是否存在該執(zhí)行計劃;如果不存在則把T-SQL翻譯成可以執(zhí)行的內(nèi)部格式,即查詢樹。
查詢優(yōu)化器(Optimizer)
查詢優(yōu)化器從命令解析器中獲取查詢樹,并為它的實際執(zhí)行做準備。生成執(zhí)行計劃的第一步是對每個查詢進行規(guī)范化,規(guī)范化的過程有可能將單個查詢分解成多個粒度合適的查詢。然后進行最優(yōu)化,SQL Server的查詢優(yōu)化器是基于成本的,它會選擇它認為成本在合理時間范圍內(nèi)最低的執(zhí)行計劃,它使用一些內(nèi)部指標(內(nèi)存需求、CPU利用率和I/O需求數(shù)目)作為選擇的依據(jù)。此外查詢優(yōu)化器還會考慮請求語句的類型、檢查受到影響的各表的數(shù)據(jù)量、表中的索引,以及SQL Server統(tǒng)計數(shù)據(jù)。這部分可以說是SQLServer最智能最負責的部分。
SQL管理器
SQL管理器負責管理與存儲過程及其計劃有關(guān)的事務(wù),并負責管理查詢的自動化參數(shù)。
數(shù)據(jù)庫管理器
數(shù)據(jù)庫管理器管理查詢編譯和查詢優(yōu)化所需的對元數(shù)據(jù)的訪問。比如,對SQL語法庫的訪問。
查詢執(zhí)行器(Query Executor)
查詢執(zhí)行器運行查詢優(yōu)化器生成的執(zhí)行計劃,根據(jù)執(zhí)行計劃中的步驟與存儲引擎進行交互,檢索或修改數(shù)據(jù)。
三、存儲引擎(Storage Engine)
存儲引擎包括存取方法、事務(wù)管理和緩沖區(qū)管理器。
存取方法(Access Methods)
SQL Server需要定位數(shù)據(jù)庫時,會調(diào)用存取方法代碼。它提供了一組代碼,用來創(chuàng)建和請求對數(shù)據(jù)頁面和索引頁面進行掃描,并且將準備好的OLE DB數(shù)據(jù)行集返回給關(guān)系引擎。存取方法并不真正進行操作,它只負責向緩沖區(qū)管理器發(fā)出請求。存取方法不僅僅如此,它還會預(yù)測哪些數(shù)據(jù)頁面索引頁面即將處理,這樣才能保證SQLServer高速處理。
事務(wù)管理器(Transaction Manager)
事務(wù)管理器包括兩個組件:日志管理器和鎖管理器。
鎖管理器負責數(shù)據(jù)的并發(fā)保護和基于特定隔離級別的管理。
日志管理器負責將事務(wù)日志提前記錄于日志文件中,從而起到保護數(shù)據(jù)的作用。訪問方法代碼請求的所有數(shù)據(jù)更改都必須記入日志中,這種方式稱為預(yù)寫日志。這是數(shù)據(jù)修改(插入、更新、刪除、分配釋放區(qū)和頁、創(chuàng)建刪除索引等)唯一總是寫磁盤的的操作。它記錄的是修改操作發(fā)生以后數(shù)據(jù)頁面發(fā)生的改變,因此我們很難從中發(fā)現(xiàn)有意義的信息。除非用些第三方的工具。
緩沖區(qū)管理器(Buffer Manager)
緩沖區(qū)管理器用來管理緩沖區(qū)內(nèi)存池中數(shù)據(jù)頁面的分布。所有對數(shù)據(jù)的操作,都是先在緩沖區(qū)中操作的。然后由SQLOS中的檢查點或者是惰性寫入器同步到磁盤中。這樣能保證SQLServer更快的響應(yīng)請求。操作完成后就結(jié)果返回給訪問方法。
四、緩沖池
緩沖池是SQLServer最消耗內(nèi)存的部分。主要包含執(zhí)行計劃緩存和數(shù)據(jù)緩存。
五、SQLOS
可以理解為是SQLServer的資源管理器,主要負責與操作系統(tǒng)中的一些交互操作。如:內(nèi)存分配、資源調(diào)度、I/O操作、進程線程管理以及同步、閂鎖等等。這部分在此不展開,后期考慮專門寫一章。
#p#
三、SQLServer執(zhí)行模型
從圖中可以看出,我這的執(zhí)行模型也說的是整個SQLServer服務(wù)端在接收請求時,要發(fā)生的事情。但是和前面一樣,SQLServer很多時候很多細化過于復(fù)雜沒有辦法能用一章圖描述清楚。這個圖簡單的說明了SQLServer的執(zhí)行模型。在分析這個圖前,要明確一個問題。SQLServer是基于C/S的結(jié)構(gòu)的產(chǎn)品。這樣很明顯就分為客戶端與服務(wù)端。平時管理數(shù)據(jù)庫的MSSMS以及我們需要訪問數(shù)據(jù)庫的系統(tǒng)就是屬于SQLServer的客戶端,SQLServer服務(wù)端主要是由一些服務(wù)方式構(gòu)成。
因為是C/S,那么客戶端的所有請求都必須傳輸?shù)椒?wù)端,才能被執(zhí)行。這樣的話就涉及的雙方通信的協(xié)議,這個協(xié)議在SQLServer2005后,就稱為SNI。包的格式就是TDS。客戶端的TDS通過SQLServer支持的協(xié)議傳輸?shù)絊QLServer服務(wù)端,服務(wù)端有一個組件叫連接監(jiān)聽服務(wù),它一直在監(jiān)聽這請求端口。它負責監(jiān)聽新的連接,清除失敗連接,將結(jié)果集、消息和狀態(tài)返回給客戶端。連接監(jiān)聽服務(wù)會把包發(fā)送給協(xié)議層,協(xié)議層對這個包進行解包,提取里面要執(zhí)行的SQL語句,交給關(guān)系引擎,關(guān)系引擎經(jīng)過處理后生成執(zhí)行計劃,并且執(zhí)行計劃。一旦關(guān)系引擎開發(fā)執(zhí)行工作計劃時,就會創(chuàng)建任務(wù)對象。任務(wù)對象必須關(guān)聯(lián)一個空閑工作線程。工作線程關(guān)聯(lián)到新任務(wù)后,狀態(tài)設(shè)置為初始化。當完成初始化后,工作線程就轉(zhuǎn)成為可運行。這時工作線程就準備就緒,只要有空閑的調(diào)度器就可以執(zhí)行了。如果執(zhí)行過程中遇到定時器等待、請求資源等待、I/O等待就會掛起移至相應(yīng)的列表中。SQLServer采用了非搶占式調(diào)度。一個線程會完成這個任務(wù)的操作。不存在上下文切換,當然如果不是SQLServer的代碼則采用搶占式調(diào)度,比如擴展存儲過程。
今天分析就到此結(jié)束,文中如有描述不當?shù)牡胤?,歡迎指出。共同進步才是硬道理。
原文鏈接:http://www.cnblogs.com/yueyue_jwfm/archive/2011/06/22/2087044.html
新聞名稱:擦亮自己的眼睛去看SQLServer之整體介紹
文章路徑:http://m.fisionsoft.com.cn/article/djdcjoj.html


咨詢
建站咨詢
