BI 專案效能測試需向維度表 time_by_day 持續寫入資料,比較三種 T-SQL 寫法的吞吐量與資源消耗。
CREATE TABLE time_by_day (
time_id INT PRIMARY KEY,
the_date DATE,
the_year SMALLINT,
month_of_year TINYINT,
quarter CHAR(2),
day_of_month TINYINT
);
INSERT INTO time_by_day (time_id, the_date, the_year, month_of_year, quarter, day_of_month)
VALUES (1101, '1999-10-01', 1999, 10, 'Q4', 1);
特點: 每筆獨立交易、大量網路往返、記錄檔頻繁 Flush、效能最差。
INSERT INTO time_by_day (time_id, the_date, the_year, month_of_year, quarter, day_of_month)
SELECT TOP 1
time_id + 1,
DATEADD(day, 1, the_date),
YEAR(DATEADD(day, 1, the_date)),
MONTH(DATEADD(day, 1, the_date)),
'Q' + CAST(DATEPART(quarter, DATEADD(day, 1, the_date)) AS CHAR(1)),
DAY(DATEADD(day, 1, the_date))
FROM time_by_day
ORDER BY time_id DESC;
優點: 單一陳述式、集合運作、最小化記錄檔寫入、可利用最少記錄(Minimal Logging,配合 TABLOCK 與簡單/大量記錄復原模式)。
DECLARE @Counter INT = 0;
WHILE @Counter < 1000
BEGIN
WAITFOR DELAY '00:00:10'; -- 控制每 10 秒一批
INSERT INTO time_by_day (...)
SELECT TOP 1 ... FROM time_by_day ORDER BY time_id DESC;
SET @Counter = @Counter + 1;
END
適用: 需模擬即時資料流、控制寫入速率避免衝擊線上系統。
| 模式 | 耗時 | 記錄檔增長 | CPU | 備註 |
|---|---|---|---|---|
| 單筆 VALUES | ~45 分鐘 | 極大 | 高 | 不建議生產使用 |
| 集合 SELECT | ~12 秒 | 最小 | 低 | 最佳效能 |
| WHILE 迴圈 | 依延遲而定 | 中等 | 中 | 速率控制場景 |
INSERT INTO target WITH (TABLOCK) SELECT ... + 簡單/大量記錄復原模式 → 僅記錄分頁配置,不記錄逐列操作。CHECKPOINT 控制記錄檔截斷。DISABLE TRIGGER、DROP INDEX,匯入後重建。ALTER TABLE ... SWITCH 瞬間上線,零停機。原文片段中 { fn QUARTER(...) } 為 ODBC 標量函數語法,標準 T-SQL 應用 DATEPART(quarter, ...);日期運算建議用 DATEADD 而非 + 運算子以確保型別安全。