在項目中遇到了sql server數據庫經過頻繁地刪減數據后,查詢變慢的問題。
我把數據導到另一個庫中,發現查詢就很快。
查了下原因,根本原因是刪除數據並不釋放表空間,日志文件太過巨大的原因。
網上查了查,解決方案如下:
第一步, 在收縮前先查看日志的大小: SELECT * FROM sysfiles WHERE name LIKE '%LOG%' GO 第二步, 把數據庫的恢復模式設成”簡單”: ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE [數據庫名] SET RECOVERY SIMPLE GO 第三步, 運行checkpoint指令, 把dirty page寫進數據庫: CHECKPOINT GO 第四步, 截斷日志: BACKUP LOG 庫名 WITH NO_LOG GO 第五步, 記錄一下日志名為下一步做准備: SELECT Name FROM sysfiles WHERE name LIKE '%LOG' GO 第六步, 收縮日志文件, 把不用的空間釋放給操作系統: DBCC SHRINKFILE (文件名, 所需大小) GO 第七步, 驗證一下日志大小是否達到所需大小了: SELECT * FROM sysfiles WHERE name LIKE '%LOG%' GO 第八步,將模式設置回去 ALTER DATABASE [數據庫名] SET RECOVERY FULL WITH NO_WAIT GO ALTER DATABASE [數據庫名] SET RECOVERY FULL GO --查詢指定數據庫的日志文件名稱 USE [數據庫名] GO SELECT name FROM SYS.database_files WHERE type_desc='LOG' 后續步驟: 1)查看你的主要數據庫, 看看日志增長是否失控; 2)查看上面的代碼, 並進行必要修改和測試以適應你的數據庫要求; 3)定期收縮數據庫 ----(注: 慎用!! 不建議用在production環境里.) 4)繼續監控數據庫大小和服務器上的可用空間大小.
釋放表空間:
DBCC SHRINKDATABASE (庫名,所需大小);