人人都是 DBA(I)SQL Server 體系結構[轉]

在瞭解 SQL Server 數據庫時,能夠先從數據庫的體系結構來觀察。SQL Server 的體系結構中包含 4 個主要組成部分:html

協議層(Protocols)

當應用程序與 SQL Server 數據庫通訊時,首先須要經過 SNI(SQL Server Network Interface)網絡接口選擇創建通訊鏈接的協議。可使用如下協議:算法

  • TCP/IP:應用最普遍的協議;
  • Named Pipes:僅爲局域網(LAN)提供服務;
  • Shared Memory:僅支持在同一臺機器上;
  • VIA(Virtual Interface Adapter):僅支持高性能 VIA 硬件;(該協議已棄用)

能夠對 SQL Server 進行配置,使其能夠同時支持多種協議。各類協議在不一樣的環境中有着不一樣的性能表現,須要根據性能需求選擇合適的協議。若是客戶端並未指定使用哪一種協議,則可配置逐個地嘗試各類協議。sql

鏈接創建後,應用程序便可與數據庫進行直接的通訊。當應用程序準備使用 T-SQL 語句 "select * from TableA" 向數據庫查詢數據時,查詢請求在應用程序側首先被翻譯成 TDS 協議包(TDS:Tabular Data Stream 即表格格式數據流協議),而後經過鏈接的通訊協議信道發送至數據庫一端。數據庫

SQL Server 協議層接收到請求,並將請求轉換成關係引擎(Relational Engine)能夠處理的形式。編程

關係引擎(Relational Engine)

關係引擎(Relational Engine)也稱爲查詢處理器(Query Processor),主要包含 3 個部分:緩存

  • 命令解析器(Command Parser)
  • 查詢優化器(Query Optimizer)
  • 查詢執行器(Query Executor)

協議層將接收到的 TDS 消息解析回 T-SQL 語句,首先傳遞給命令解析器(Command Parser)。安全

命令解析器(Command Parser)檢查 T-SQL 語法的正確性,並將 T-SQL 語句轉換成能夠進行操做的內部格式,即查詢樹(Query Tree)。服務器

  • 查詢樹(Query Tree)是結構化查詢語言 SQL(Structured Query Language)的內部表現形式。
  • 數據操縱語言 DML(Data Manipulation Language)是 SQL 語言的子集,包括 INSERT, UPDATE, DELETE 三種核心指令。
  • 數據定義語言 DDL(Data Definition Language)管理表和索引結構,包括 CREATE, DROP, ALTER, TRUNCATE 等命令。
  • 數據控制語言 DCL(Data Control Language)負責受權用戶訪問和處理數據,包括 GRANT, REVOKE 等命名。
  • T-SQL 即 Transact-SQL 則是在 SQL 基礎上擴展了過程化編程語言的功能,如流程控制等。
  • SQLCLR(SQL Server Common Language Runtime)使用 .NET 程序集來擴展功能。

查詢優化器(Query Optimizer)從命令解析器處獲得查詢樹(Query Tree),判斷查詢樹是否可被優化,而後將從許多可能的方式中肯定一種最佳方式,對查詢樹進行優化。網絡

  • 沒法優化的語句,包括控制流和 DDL 等,將被編譯成內部形式。
  • 可優化的語句,例如 DML 等,將被作上標記等待優化。

優化步驟首先進行規範查詢(Normalize Query),能夠將單個查詢分解成多個細粒度的查詢,並對細粒度的查詢進行優化,這意味着它將爲執行查詢肯定計劃,因此查詢優化器的結果是產生一個執行計劃(Execution Plan)。數據結構

查詢優化是基於成本的(Cost-based)考量的,也就是說,選擇成本效益最高的計劃。查詢優化器須要根據內部記錄的性能指標選擇消耗最少的計劃。這些內部性能指標包括:Memory 需求、CPU 利用率和 I/O 操做數量等。同時,查詢優化還使用啓發式算法(Pruning Heuristics),以確保評估優化及查詢的時間消耗不會比直接執行未優化查詢的時間更長。

在完成查詢的規範化和最優化以後,這些過程產生的結果將被編譯成執行計劃(Execution Plan)數據結構。執行計劃中包括查詢哪張表、使用哪一個索引、檢查何種安全性以及哪些條件爲什麼值等信息。

查詢執行器(Query Executor)運行查詢優化器(Query Optimizer)產生的執行計劃,在執行計劃中充當全部命令的調度程序,並跟蹤每一個命令執行的過程。大多數命令須要與存儲引擎(Storage Engine)進行交互,以檢索或修改數據等。

存儲引擎(Storage Engine)

SQL Server 存儲引擎中包含負責訪問和管理數據的組件,主要包括:

  • 訪問方法(Access Methods)
  • 鎖管理器(Lock Manager)
  • 事務服務(Transaction Services)
  • 實用工具(Controlling Utilities)

訪問方法(Access Methods)包含建立、更新和查詢數據的具體操做,下面列出了一些訪問方法類型:

  • 行和索引操做(Row and Index Operations):負責操做和維護磁盤上的數據結構,也就是數據行和 B 樹索引。
  • 頁分配操做(Page Allocation Operations):每一個數據庫都是 8KB 磁盤頁的集合,這些磁盤頁分佈在多個物理文件中。SQL Server 使用 13 種磁盤頁面結構,包括數據頁面、索引頁面等。
  • 版本操做(Versioning Operations):用於維護行變化的版本,以支持快照隔離(Snapshot Isolation)功能等。

訪問方法並不直接檢索頁面,它向緩衝區管理器(Buffer Manager)發送請求,緩衝區管理器在其管理的緩存中掃描頁面,或者將頁面從磁盤讀取到緩存中。在掃描啓動時,會使用預測先行(Look-ahead Mechanism)機制對頁面中的行或索引進行驗證。

鎖管理器(Lock Manager)用於控制表、頁面、行和系統數據的鎖定,負責在多用戶環境下解決衝突問題,管理不一樣類型鎖的兼容性,解決死鎖問題,以及根據須要提高鎖(Escalate Locks)的功能。

事務服務(Transaction Services)用於提供事務的 ACID 屬性支持。ACID 屬性包括:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

預寫日誌(Write-ahead Logging)功能確保在真正發生變化的數據頁寫入磁盤前,始終先在磁盤中寫入日誌記錄,使得任務回滾成爲可能。寫入事務日誌是同步的,即 SQL Server 必須等它完成。但寫入數據頁能夠是異步的,因此能夠在緩存中組織須要寫入的數據頁進行批量寫入,以提升寫入性能。

SQL Server 支持兩種併發模型來保證事務的 ACID 屬性:

  • 悲觀併發(Pessimistic Concurrency)假設衝突始終會發生,經過鎖定數據來確保正確性和併發性。
  • 樂觀併發(Optimistic Concurrency)假設不會發生衝突,在碰到衝突再進行處理。

在樂觀併發模型中,用戶讀數據時不鎖定數據。在執行更新時,系統進行檢查,查看另外一個用戶讀過數據後是否更改了數據。若是另外一個用戶更改了數據,則產生一個錯誤,接收錯誤信息的用戶將回滾事務。該模型主要用在數據爭奪少的環境中,以及鎖定數據的成本超過回滾事務的成本時。

SQL Server 提供了 5 中隔離級別(Isolation Level),在處理多用戶併發時能夠支持不一樣的併發模型。

  • Read Uncommitted:僅支持悲觀併發;
  • Repeatable Read:僅支持悲觀併發;
  • Serializable:僅支持悲觀併發;
  • Snapshot: 支持樂觀併發;
  • Read Committed:默認隔離級別,依據配置既可支持悲觀併發也可支持樂觀併發。

實用工具(Controlling Utilities)中包含用於控制存儲引擎的工具,如批量加載(Bulk-load)、DBCC 命令、全文本索引管理(Full-text Index Management)、備份和還原命令等。

SQLOS

SQLOS 是一個單獨的應用層,位於 SQL Server 引擎的最低層。SQLOS 的主要功能包括:

  • 調度(Scheduling)
  • 內存管理(Memory Management)
  • 同步(Synchronization):提供 Spinlock, Mutex, ReaderWriterLock 等鎖機制。
  • 內存代理(Memory Broker):提供 Memory Distribution 而不是 Memory Allocation。
  • 錯誤處理(Exception Handling)
  • 死鎖檢測(Deadlock Detection)
  • 擴展事件(Extended Events)
  • 異步 I/O(Asynchronous IO)

數據庫體系結構對比

實際上,若是從體系結構的總體上來比較,各類常見的關係型數據庫的體系結構都是差很少的。這也使得咱們在瞭解一種數據庫後,能夠大致的猜想和快速理解另外一種數據庫。

下面是 Oracle 數據庫的架構圖:

下面是 MySQL 數據庫的結構圖:

MySQL 數據庫在存儲引擎部分實現了可插拔式設計(Pluggable Storage Engines),能夠根據需求不一樣選擇不一樣類型的存儲引擎實現。

 Feature 

 InnoDB 

 MyISAM 

 Memory 

 Storage Limits 

 64TB

 256TB

 RAM

Transactions

 Yes

 No

 No

 Locking Granularity 

 Row

 Table

 Table

B-Tree Indexes

 Yes

 Yes

 Yes

Compressed Data

 Yes  Yes  No

Encrypted Data

 Yes  Yes  Yes

 Full-Text Search Indexes 

 Yes  Yes  No

Foreign Key Support

 Yes  No  No

甚至在同一個數據庫實例中,每張數據表均可以指定使用哪一種存儲引擎。

CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;

 

《人人都是 DBA》系列文章索引:

 序號 

 名稱 

1

 人人都是 DBA(I)SQL Server 體系結構

2

 人人都是 DBA(II)SQL Server 元數據

3

 人人都是 DBA(III)SQL Server 調度器

4

 人人都是 DBA(IV)SQL Server 內存管理

5

 人人都是 DBA(V)SQL Server 數據庫文件

6

 人人都是 DBA(VI)SQL Server 事務日誌

7

 人人都是 DBA(VII)B 樹和 B+ 樹

8

 人人都是 DBA(VIII)SQL Server 頁存儲結構

9

 人人都是 DBA(IX)服務器信息收集腳本彙編

10

 人人都是 DBA(X)資源信息收集腳本彙編

11

 人人都是 DBA(XI)I/O 信息收集腳本彙編

12

 人人都是 DBA(XII)查詢信息收集腳本彙編

13

 人人都是 DBA(XIII)索引信息收集腳本彙編

14

 人人都是 DBA(XIV)存儲過程信息收集腳本彙編 

15

 人人都是 DBA(XV)鎖信息收集腳本彙編

相關文章
相關標籤/搜索