前言
今天稍早的時候與同事聊天時提及到了 mdf、ndf 以及 ldf 之間的關係
讓我想起之前遇到 ldf 檔案大小爆炸級別的成長時
深感對這方面的知識量不足
因此特地借閱了 Pro SQL Server Internals 來進行閱讀
想了想後 乾脆把這些筆記貼出來
也方便我未來時方便進行查閱
以下正文內容皆是我閱讀時所記錄下來的
如果有任何錯誤也麻煩在留言區告訴我一聲
我會立即進行修改的
以下節錄至 Pro SQL Server Internals Chapter 1
每個資料庫中都含有一個或多個 Transaction Log File 以及 一個或多個 Data Files
而 Transaction Log File 主要的功用便是記錄下所有Session下所有資料修改的交易紀錄
以便在遇到問題時進行 Transaction Rollback 或 Redo
每個資料庫只會有一個 Primary Data File 預設副檔名為 .mdf
而資料庫也可以擁有 Secondary Data File 預設副檔名為 .ndf
所有資料庫檔案都將被 group 到 Filegroup 中以便資料庫管理
根據經驗法則(Rule of thumb)習慣上設定4 Data File 與 16 logical CPU 運作, 而在此之後則保持檔案數量與邏輯CPU的比率為1:8
在 File 成長的部分 MSSQL 分成 AUTOGROW_SINGLE_FILE 及 AUTOGROW_ALL_FILES
AUTOGROW_SINGLE_FILE 將只針對 Filegroup 底下的單獨 File 進行增長
AUTOGROW_ALL_FILES 則針對 Filegroup 底下的所有 File 進行增長
SQL Server 預設會對Transaction Log File 進行校正歸零的行為
而透過 Instant File Initialization 的啟用或關閉則可加速資料庫的創建或修復
SQL Server 主要有三種方式去進行資料存取
- row-based storage
透過 data row 將所有Column的資料結合在一起進行存放 - column-based storage
與前者相反這項技術的儲存單位則為 Column - In-memory storage
這部分將在 VIII 進行詳細的解說
SQL Server 提供了多元的資料型態
而這些資料型態分為
1. 固定長度
2. 可變長度
在固定長度下,儲存空間為固定大小就算裡頭的值為 NULL 也是同樣 (int: 4 Bytes, nchar(10): 20 Bytes)
而可變長度下在通常狀況下 則為原先大小加上 2 額外的 Bytes
例如 nvarchar(4000) 去存放一個 5 字元的資料 則會使用 12 Bytes 去儲存
而通常情況下則使用 2 Bytes 去存放 NULL
上面