網路上流傳一篇「.NET + SQL Server 4 秒導入 100 萬筆」的挑戰文。作者好奇用 **Visual FoxPro (VFP)** 這個古老的 xBase 系資料庫試跑,結果令人震驚。
t1,單一整數欄位 f1SET TALK OFF
thisform.label1.Caption = TTOC(DATETIME()) && 記錄開始時間
SELECT t1
FOR i = 1 TO 1000000 && 100 萬
APPEND BLANK
REPLACE f1 WITH i
ENDFOR
thisform.label2.Caption = TTOC(DATETIME()) && 記錄結束時間
| 筆數 | 耗時 | 備註 |
|---|---|---|
| 100 萬 | < 1 秒 | 標籤顯示精度僅秒,實際約 0.8 秒 |
| 1000 萬 | 5 秒 | 將迴圈上限改為 10000000 |
APPEND BLANK 只在記憶體緩衝區操作,REPLACE 修改緩衝區,**由作業系統緩存決定何時落盤** (延遲寫入)。| 特性 | VFP (免費表/無交易) | SQL Server / PostgreSQL / MySQL (InnoDB) |
|---|---|---|
| 資料持久性保證 | **無** (斷電/崩潰 = 資料遺失/損毀) | **ACID** (WAL/Redo Log 保證) |
| 並發存取 | 表級鎖,極易衝突 | 列級鎖/MVCC,高並發 |
| 資料完整性 | 無外鍵、約束、觸發器 | 完整約束體系 |
| 備份/還原/時間點復原 | 手動複製檔案 | 線上備份、PITR、複寫 |
| 適用場景 | 單機、單用戶、唯讀/追加為主、可容忍遺失的暫存/匯入暫存表 | 所有核心業務系統 |
若要比較資料庫大量載入效能,必須在**相同 ACID 等級**下:
BULK INSERT / bcp / SqlBulkCopy + **最小日誌記錄** (簡單/大量記錄模式) + **TABLOCK** + **無索引/稍後建索引** + **資料排序符合叢集鍵**。COPY + UNLOGGED TABLE (或稍後 ALTER TABLE ... SET LOGGED) + 同步關閉 fsync=off (僅測試)。LOAD DATA INFILE + innodb_flush_log_at_trx_commit=2 + 禁用雙寫緩衝。在此公平基準下,現代關係型資料庫**單表每秒百萬列**輕鬆達成 (SSD + 批次大小調優)。
VFP 5 秒寫入 1000 萬筆,**證明的是 xBase 儲存引擎在「犧牲所有可靠性換取寫入速度」的極致**,而非資料庫技術優劣。
**真正的資料庫極限,是在 ACID、並發、可擴展、可運維的約束下,榨乾硬體效能。**
選擇技術請問三問:資料丟了怎麼辦? 多人同時改怎麼辦? 明年資料量增 10 倍怎麼辦?