国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

由于文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁

2024-07-24 12:42:35
字體:
來源:轉載
供稿:網友

   今天接到一個朋友的問題,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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜昌市| 施甸县| 永济市| 房山区| 应城市| 林口县| 社旗县| 阜平县| 迁西县| 湛江市| 禄丰县| 北碚区| 郑州市| 桂阳县| 博野县| 桐城市| 榆林市| 望江县| 宜章县| 铜川市| 黄陵县| 苗栗县| 温宿县| 清涧县| 孙吴县| 博野县| 涟水县| 霍山县| 天长市| 调兵山市| 四子王旗| 达日县| 溆浦县| 莫力| 陆河县| 石柱| 清徐县| 邯郸县| 贵德县| 建水县| 达尔|