sql server mdf文件數據過大的解決辦法


EXEC sp_spaceused @updateusage = N'TRUE';

 

原文鏈接:https://jingyan.baidu.com/album/215817f7a1c8fb1eda1423ca.html?picindex=6

https://blog.csdn.net/fucong920618717/article/details/89371392

背景1:TCX_1807現場數據庫的mdf文件有90+G,ldf文件倒是不到只有幾兆,我懷疑是上次執行了歷史數據庫后刪除了很多數據,而這些數據所占的空間並不會自動縮小,因而導致mdf文件過大。

背景2:TCX_1909現場數據庫的mdf文件有10+G,ldf文件也不是很多,也執行了數據歷史化。對現場數據庫備份后bak文件有3+G,還原到本地后刪除了大表數據,收縮了數據庫,再次備份本地數據庫bak文件和mdf文件竟然有4+G,mdf文件減少可以理解,bak文件比在現場備份的還大就不理解了???

 

分析問題時用到的sql腳本

查詢數據庫的大小的系統存儲過程sp_spaceused(會返回兩條數據):

為了保證查詢結果的實時性,推薦使用 @updateusage 參數來確保統計數據是最新的:

EXEC sp_spaceused @updateusage = N'TRUE';

 

具體查詢某個表的大小:

EXEC sp_spaceused 't_dd_qm_quality_collection_final'

 

 

 

查詢數據庫中所有表的大小的SQL語句(2種):

第一種:通過表變量

declare @table_spaceused table (name nvarchar(100) ,rows int ,reserved nvarchar(100) ,data nvarchar(100) ,index_size nvarchar(100) ,unused nvarchar(100) ) 
insert into @table_spaceused (name,rows,reserved,data,index_size,unused ) exec sp_MSforeachtable @command1='exec sp_spaceused ''?''' 
select * from @table_spaceused order  by  rows desc

 

 第二種:通過臨時表

IF OBJECT_ID('tempdb..#TablesSizes') IS NOT NULL DROP TABLE #TablesSizes
CREATE TABLE #TablesSizes(TableName sysname,Rows BIGINT,reserved VARCHAR(100),data VARCHAR(100),index_size VARCHAR(100),unused VARCHAR(100))
DECLARE @sql VARCHAR(MAX)
SELECT  @sql = COALESCE(@sql, '') + 'INSERT INTO #TablesSizes execute sp_spaceused ''' + QUOTENAME(TABLE_SCHEMA, '[]') + '.'  + QUOTENAME(Table_Name, '[]') + ''''
FROM    INFORMATION_SCHEMA.TABLES WHERE   TABLE_TYPE = 'BASE TABLE'
PRINT ( @SQL )
EXECUTE (@SQL)
SELECT *  FROM    #TablesSizes ORDER BY Rows DESC

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM