Sql-Server-2008-R2

SELECT 錯誤 - 主文件組已滿

  • January 14, 2021

SQL Server 2008 R2 數據庫視圖聯合了多個事務表。幾個月來,查詢一直很慢,開發團隊正計劃重新創建查詢。我需要將結果 ETL 到一個平面文件中並從數據庫中清除它們。當我嘗試查詢視圖(5M 條記錄)時,出現了這個錯誤:

*消息 1105,級別 17,狀態 2,第 1 行

無法為數據庫“tempdb”中的對象“dbo.SORT 臨時執行儲存:140744470495232”分配空間,因為“PRIMARY”文件組已滿。通過刪除不需要的文件、刪除文件組中的對象、向文件組添加其他文件或為文件組中的現有文件設置自動增長來創建磁碟空間。*

我應該設置的推薦文件增長是多少,如何管理或解決此錯誤?提前致謝。

最快的解決方法是重新啟動 SQL Server,然後 Tempdb 將使用預設大小和空文件重新創建。

但是,如果它是生產伺服器,則無法在需要時真正重新啟動它。真正的解決方法是在不同的驅動器上添加一個新文件並執行您的查詢。

一個範例是(起始大小為 1 MB 的新文件,增加 100 MB,限制為 500 MB):

USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'newtempfile', FILENAME = N'e:\newtempfile.ndf' , SIZE = 100MB, MAXSIZE = 500MB , FILEGROWTH = 100MB )
GO

然後,當您有時間時,檢查一下使用 Tempdb 的原因。但是很可能您仍然需要 TempDB 的空間,因此您最好為此規劃空間並為此 db 分配足夠的空間,因為它對於健康的系統非常重要(您可以簡單地將其視為 RAM 部分)。

PS1:檢查您的選擇語句中是否沒有笛卡爾積,因為這個數字似乎有點高。

PS2:如果您在 TempDB 驅動器上有足夠的可用空間,請檢查文件是否未達到其限制並禁用自動增長。如果是,請啟用自動增長(不是按百分比,而是按您覺得舒服的某個特定大小)。

PS3:一個好的解決方案是將 ETL 過程分解為更小的事務。與其一次刪除 1 Bil 記錄,不如按 1000 mill .. 執行或使用批量大小,直到您對過程的長度和文件的大小感到安全為止。您可能會更快地獲得結果,並且不會立即大幅增加空間。

該錯誤很可能表明您的 tempdb 所在的硬碟驅動器已滿。最簡單的解決方案是插入一個新驅動器,然後將 tempdb 移到那裡。

首先,通過在 tempdb 的上下文中執行以下查詢,找出構成 tempdb 的文件的名稱:

EXEC sp_helpfile
GO

使用上述腳本中的文件名更改以下腳本:

USE master
GO
ALTER DATABASE TempDB MODIFY FILE
 (NAME = tempdev, FILENAME = 'e\:<tempdb datafile>.mdf')
GO
ALTER DATABASE TempDB MODIFY FILE
 (NAME = templog, FILENAME = 'e:\<tempdb log>.ldf')
GO

顯然,E:\用新的驅動器號替換。

完成後,重新啟動 SQL Server 以實際移動 tempdb,然後嘗試查看是否解決了問題。

引用自:https://dba.stackexchange.com/questions/28976