錯誤訊息:
由於文件組 'DEFAULT' 中的磁盤空間不足,無法為數據庫 'TEMPDB' 分配新頁
實際磁碟剩餘 40GB,但 tempdb.mdf 僅 4GB 即報錯 → 根因:資料檔所在磁碟分區為 FAT32,單檔限制 4GB。
tempdb 會重建回初始大小 (預設 8MB)。DBCC SHRINKFILE (tempdev, 10); -- 縮至 10MB DBCC SHRINKFILE (templog, 10);
tempdev、templog 最大值 4000 MB (略低於 4GB 限制)。convert X: /fs:ntfs (需排程重啟)。ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = 'X:\MSSQL\Data\tempdev2.ndf', SIZE = 100MB, MAXSIZE = 4000MB, FILEGROWTH = 100MB); ALTER DATABASE tempdb ADD FILE (NAME = tempdev3, FILENAME = 'Y:\MSSQL\Data\tempdev3.ndf', SIZE = 100MB, MAXSIZE = 4000MB, FILEGROWTH = 100MB); -- 建議檔案數 = 邏輯 CPU 核心數 (最多 8),分佈於不同物理磁碟
-- 錯誤模式:單一巨大交易 BEGIN TRAN INSERT INTO target SELECT ... FROM big_table_a JOIN big_table_b ... -- 產生海量 tempdb 排序/雜湊 COMMIT TRAN -- 優化模式:分批提交 DECLARE @batch INT = 10000, @rowcount INT = 1; WHILE @rowcount > 0 BEGIN BEGIN TRAN INSERT TOP (@batch) INTO target SELECT ... FROM ... WHERE id > @last_id ORDER BY id; SET @rowcount = @@ROWCOUNT; SET @last_id = (SELECT MAX(id) FROM target); COMMIT TRAN CHECKPOINT; -- 釋放 tempdb 空間 WAITFOR DELAY '00:00:00.100'; -- 降低鎖衝突 END
MAXSIZE 設定略低於磁碟剩餘空間,FILEGROWTH 固定 MB (非百分比)。tempdb 空間使用率,設定告警 > 70%。sys.dm_db_file_space_usage、sys.dm_db_session_space_usage 找出大消費者。