在瞭解 SQL Server 數據庫時,能夠先從數據庫的體系結構來觀察。SQL Server 的體系結構中包含 4 個主要組成部分:html
當應用程序與 SQL Server 數據庫通訊時,首先須要經過 SNI(SQL Server Network Interface)網絡接口選擇創建通訊鏈接的協議。可使用如下協議:算法
能夠對 SQL Server 進行配置,使其能夠同時支持多種協議。各類協議在不一樣的環境中有着不一樣的性能表現,須要根據性能需求選擇合適的協議。若是客戶端並未指定使用哪一種協議,則可配置逐個地嘗試各類協議。sql
鏈接創建後,應用程序便可與數據庫進行直接的通訊。當應用程序準備使用 T-SQL 語句 "select * from TableA" 向數據庫查詢數據時,查詢請求在應用程序側首先被翻譯成 TDS 協議包(TDS:Tabular Data Stream 即表格格式數據流協議),而後經過鏈接的通訊協議信道發送至數據庫一端。數據庫
SQL Server 協議層接收到請求,並將請求轉換成關係引擎(Relational Engine)能夠處理的形式。編程
關係引擎(Relational Engine)也稱爲查詢處理器(Query Processor),主要包含 3 個部分:緩存
協議層將接收到的 TDS 消息解析回 T-SQL 語句,首先傳遞給命令解析器(Command Parser)。安全
命令解析器(Command Parser)檢查 T-SQL 語法的正確性,並將 T-SQL 語句轉換成能夠進行操做的內部格式,即查詢樹(Query Tree)。服務器
查詢優化器(Query Optimizer)從命令解析器處獲得查詢樹(Query Tree),判斷查詢樹是否可被優化,而後將從許多可能的方式中肯定一種最佳方式,對查詢樹進行優化。網絡
優化步驟首先進行規範查詢(Normalize Query),能夠將單個查詢分解成多個細粒度的查詢,並對細粒度的查詢進行優化,這意味着它將爲執行查詢肯定計劃,因此查詢優化器的結果是產生一個執行計劃(Execution Plan)。數據結構
查詢優化是基於成本的(Cost-based)考量的,也就是說,選擇成本效益最高的計劃。查詢優化器須要根據內部記錄的性能指標選擇消耗最少的計劃。這些內部性能指標包括:Memory 需求、CPU 利用率和 I/O 操做數量等。同時,查詢優化還使用啓發式算法(Pruning Heuristics),以確保評估優化及查詢的時間消耗不會比直接執行未優化查詢的時間更長。
在完成查詢的規範化和最優化以後,這些過程產生的結果將被編譯成執行計劃(Execution Plan)數據結構。執行計劃中包括查詢哪張表、使用哪一個索引、檢查何種安全性以及哪些條件爲什麼值等信息。
查詢執行器(Query Executor)運行查詢優化器(Query Optimizer)產生的執行計劃,在執行計劃中充當全部命令的調度程序,並跟蹤每一個命令執行的過程。大多數命令須要與存儲引擎(Storage Engine)進行交互,以檢索或修改數據等。
SQL Server 存儲引擎中包含負責訪問和管理數據的組件,主要包括:
訪問方法(Access Methods)包含建立、更新和查詢數據的具體操做,下面列出了一些訪問方法類型:
訪問方法並不直接檢索頁面,它向緩衝區管理器(Buffer Manager)發送請求,緩衝區管理器在其管理的緩存中掃描頁面,或者將頁面從磁盤讀取到緩存中。在掃描啓動時,會使用預測先行(Look-ahead Mechanism)機制對頁面中的行或索引進行驗證。
鎖管理器(Lock Manager)用於控制表、頁面、行和系統數據的鎖定,負責在多用戶環境下解決衝突問題,管理不一樣類型鎖的兼容性,解決死鎖問題,以及根據須要提高鎖(Escalate Locks)的功能。
事務服務(Transaction Services)用於提供事務的 ACID 屬性支持。ACID 屬性包括:
預寫日誌(Write-ahead Logging)功能確保在真正發生變化的數據頁寫入磁盤前,始終先在磁盤中寫入日誌記錄,使得任務回滾成爲可能。寫入事務日誌是同步的,即 SQL Server 必須等它完成。但寫入數據頁能夠是異步的,因此能夠在緩存中組織須要寫入的數據頁進行批量寫入,以提升寫入性能。
SQL Server 支持兩種併發模型來保證事務的 ACID 屬性:
在樂觀併發模型中,用戶讀數據時不鎖定數據。在執行更新時,系統進行檢查,查看另外一個用戶讀過數據後是否更改了數據。若是另外一個用戶更改了數據,則產生一個錯誤,接收錯誤信息的用戶將回滾事務。該模型主要用在數據爭奪少的環境中,以及鎖定數據的成本超過回滾事務的成本時。
SQL Server 提供了 5 中隔離級別(Isolation Level),在處理多用戶併發時能夠支持不一樣的併發模型。
實用工具(Controlling Utilities)中包含用於控制存儲引擎的工具,如批量加載(Bulk-load)、DBCC 命令、全文本索引管理(Full-text Index Management)、備份和還原命令等。
SQLOS 是一個單獨的應用層,位於 SQL Server 引擎的最低層。SQLOS 的主要功能包括:
實際上,若是從體系結構的總體上來比較,各類常見的關係型數據庫的體系結構都是差很少的。這也使得咱們在瞭解一種數據庫後,能夠大致的猜想和快速理解另外一種數據庫。
下面是 Oracle 數據庫的架構圖:
下面是 MySQL 數據庫的結構圖:
MySQL 數據庫在存儲引擎部分實現了可插拔式設計(Pluggable Storage Engines),能夠根據需求不一樣選擇不一樣類型的存儲引擎實現。
甚至在同一個數據庫實例中,每張數據表均可以指定使用哪一種存儲引擎。
CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;
《人人都是 DBA》系列文章索引: