續篇:無索引排序 250 萬筆,虛擬硬碟 11 秒 vs 硬碟逾時
上篇驗證有索引查詢提升 8 倍,本篇測試 **無索引 `ORDER BY ProductName, ProductID` 分頁** 場景。
測試環境
- 筆電:Core 2 7250 2.0GHz、4GB RAM (2GB 劃分 RamDisk,讀 5.5GB/s、寫 3.5GB/s)、160GB HDD (70MB/s)。
- SQL Server 2000 + ASP.NET 2.0、Northwind `Products` 擴充至 252 萬筆 (每頁 15 筆,共 16.8 萬頁)。
- 對比兩庫:`northwnd_Disk` (實體碟) vs `northwnd_Ram` (RamDisk)。
關鍵發現:tempdb 才是關鍵
- 初測將整庫放 RamDisk,**無索引排序翻第 1000 頁直接逾時**,硬碟燈狂閃。
- 發現 SQL Server 2000 大量排序會大量寫入 **tempdb** (寫入 100MB+),才是瓶頸。
- 將 **tempdb 移至 RamDisk** (`ALTER DATABASE tempdb MODIFY FILE ...`),重測:
| 頁碼 | RamDisk (tempdb 在記憶體) | 實體碟 |
| 第 1,000 頁 | ~11 秒 | 逾時 |
| 第 5,000 頁 | ~11 秒 | 逾時 |
| 第 10,000 頁 | ~12 秒 | 逾時 |
| 第 100,000 頁 | ~22 秒 | 逾時 |
移動 tempdb 指令
USE master;
GO
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'T:\Data\tempdb.mdf');
GO
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'T:\Data\templog.ldf');
GO
-- 重啟 SQL Server 服務生效
結論與風險
- **tempdb 置記憶體 = 釋放排序/雜湊/版本存放區 I/O 瓶頸**,對無索引大掃描排序效果驚人。
- tempdb 內容無持久化需求,重啟自動重建,**風險極低、收益極高**。
- RamDisk 軟體需支援開機自動掛載、掉電保護 (如有 UPS) 或接受重啟後資料遺失。
- 現代 SQL Server (2012+) 已大幅優化 tempdb (多檔案、記憶體優化、延遲持久性),**物理記憶體足夠大時,直接加大實體記憶體並設定多 tempdb 檔案通常優於 RamDisk**。