由于文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁
來源:易賢網 閱讀:5129 次 日期:2014-11-03 15:41:25
溫馨提示:易賢網小編為您整理了“由于文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁”,方便廣大網友查閱!

今天接到一個朋友的問題,sql server報“由于文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁”,按照錯誤提示應該是tempdb空間不足,讓其查看tempdb對應數據庫文件大小為不到4g,查看其對應文件為自增長,硬盤空間還有40g多點,那應該沒有問題。后來她說該文件所處位置的盤是fat32的,那問題確定是fat32最大支持文件大小是4g。解決辦法:

1、讓tempdb中的文件恢復默認值,設置其最大值

1)重啟sql server服務,tempdb一般會自動變為初始化大小

2)如果1)失敗,使用下面語句

dbcc shrinkfile (tempdev, 10)

dbcc shrinkfile (templog, 10)

2)然后設置tempdev和templog的最大大小為4000m

2、添加數據文件和日志文件,并設置其最大值為4000m

3、修改程序,從根源上解決問題

分析產生該問題原因

詢問朋友后,原來是她對一個6kw的表和1kw的表進行關聯,然后取得需要的數據插入到另一張表中,因為涉及的數據量非常大,所有導致tempdb數據庫飛速增大,超過系統文件大小限制。導致文章開始的錯誤,光添加文件,對于這么大數據量的程序來說還是不能解決問題。應該在程序上去優化,而不是靠添加tempdb中文件的大小和數量來解決問題。

添加程序的提交次數,而不是所有數據一次提交,放在一個事物中。

我根據程序需求模擬的寫了兩種處理過程的方法

模擬環境:

--創建模擬表

SELECT id,name INTO t_1 FROM sys.sysobjects;

SELECT object_id id,name INTO t_2 FROM sys.columns;

--創建跟蹤表

CREATE TABLE t_s (id int DEFAULT 0,date datetime DEFAULT getdate());

INSERT INTO t_s VALUES(0,getdate());

--創建需要插入數據表

SELECT t1.name n1,

t2.name n2,

t1.id

INTO test_1

FROM t_1 t1,

t_2 t2

WHERE t1.id = t2.id

AND 1=2;

方法一:

特點:1、優點執行效率比較高,無需排序和插入跟蹤表

2、缺點:不能查看程序執行進度,如果異常終止,必須重新執行

create PROCEDURE [dbo].[INSERT_d_1]

AS

DECLARE @name1 varchar(4000)

DECLARE @name2 varchar(4000)

DECLARE @id int

DECLARE c1 CURSOR

FOR

SELECT t1.name,

t2.name,

t1.id

FROM t_1 t1,

t_2 t2

WHERE t1.id = t2.id

ORDER BY

t1.id

open c1

fetch next from c1 into @name1,@name2,@id

WHILE @@fetch_status=0

BEGIN

INSERT INTO test_1 VALUES(@name1,@name2,@id)

FETCH next FROM c1 INTO @name1,@name2,@id

END

CLOSE c1

DEALLOCATE c1

方法二:

特點:1、可以跟蹤程序的執行進度查詢t_s表,如果異常終止可以寫其他程序繼續

2、程序使用二重游標,執行效率比較低

create PROCEDURE [dbo].[INSERT_d_2]

AS

DECLARE @name1 varchar(4000)

DECLARE @name2 varchar(4000)

DECLARE @id int

DECLARE c1 CURSOR

FOR

SELECT t1.name,

t1.id

FROM t_1 t1

ORDER BY t1.id

open c1

fetch next from c1 into @name1,@id

WHILE @@fetch_status=0

BEGIN

--二重循環

DECLARE c2 CURSOR FOR

SELECT t2.name FROM t_2 t2 WHERE t2.id=@id

OPEN c2

FETCH next FROM c2 INTO @name2

WHILE @@FETCH_STATUS=0

BEGIN

INSERT INTO test_1 VALUES(@name1,@name2,@id)

UPDATE t_s SET id=@id,date=getdate()

FETCH next FROM c2 INTO @name2

END

CLOSE c2

DEALLOCATE c2

FETCH next FROM c1 INTO @name1,@id

END

CLOSE c1

DEALLOCATE c1

更多信息請查看IT技術專欄

更多信息請查看數據庫
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
未满十八18勿进黄网站免费看