This commit is contained in:
Thierry Schork
2026-02-23 08:12:06 +01:00
parent 820c487c35
commit 634dc10c8c
8 changed files with 295 additions and 25 deletions

View File

@@ -1,4 +1,6 @@
--databases space
--how much data we pad when we shrink, and the min disk size to start a shrink
DECLARE @limit INT=512;
IF OBJECT_ID('tempdb..#dbs')IS NOT NULL BEGIN;
DROP TABLE #dbs;
END;
@@ -7,12 +9,12 @@ CREATE TABLE #dbs ( [database_name] NVARCHAR(128), [log_size_mb] DECIMAL(18,2),
INSERT INTO [#dbs] ([database_name], [log_size_mb], [row_size_mb], [total_size_mb])
SELECT
database_name = DB_NAME(database_id)
, log_size_mb = CAST(SUM(CASE WHEN f.type_desc = 'LOG' THEN size END) * 8. / 1024 AS DECIMAL(18,2))
, row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8. / 1024 AS DECIMAL(18,2))
, total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2))
database_name = DB_NAME([F].[database_id])
, log_size_mb = CAST(SUM(CASE WHEN [F].[type_desc] = 'LOG' THEN [F].[size] END) * 8. / 1024 AS DECIMAL(18,2))
, row_size_mb = CAST(SUM(CASE WHEN [F].[type_desc] = 'ROWS' THEN [F].[size] END) * 8. / 1024 AS DECIMAL(18,2))
, total_size_mb = CAST(SUM([F].[size]) * 8. / 1024 AS DECIMAL(18,2))
FROM sys.master_files F WITH(NOWAIT)
GROUP BY F.database_id
GROUP BY [F].[database_id]
ORDER BY [total_size_mb] DESC
IF OBJECT_ID('tempdb..#FileSize')IS NOT NULL BEGIN;
@@ -26,7 +28,7 @@ CREATE TABLE #FileSize(
FreeSpaceMB DECIMAL(10,2) NULL
)
INSERT INTO #FileSize(dbName, FileName, type_desc, CurrentSizeMB, FreeSpaceMB)
exec sp_msforeachdb
exec [sys].[sp_MSforeachdb]
'use [?];
SELECT DB_NAME() AS DbName,
name AS FileName,
@@ -41,19 +43,25 @@ SELECT *
FROM #FileSize
*/
--details
SELECT
d.[name] AS dbName
,f.[physical_name] AS physicalFileName
,[F].[physical_name] AS physicalFileName
,f.[name] AS logicalFileName
--,d2.[log_size_mb]
--,d2.[row_size_mb]
,[d].[recovery_model_desc]
,'-----' AS separator
,CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS fileSizeMB
,fs.[FreeSpaceMB] AS FreeSpaceInFileMB
,fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS SpaceUsedMB
,CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8. / 1024 AS DECIMAL(18,2))) AS NUMERIC(6,2)) AS fileSpaceUsedPercent
--,CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS fileSizeMB
,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2))), 1),',',''''),'.00','') as fileSizeMB
--,fs.[FreeSpaceMB] AS FreeSpaceInFileMB
,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [fs].[FreeSpaceMB]), 1),',',''''),'.00','') as FreeSpaceInFileMB
--,(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS MONEY))AS SpaceUsedMB
,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]), 1),',',''''),'.00','') as SpaceUsedMB
,CAST(([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]) * 100 / (CAST([F].[size] * 8. / 1024 AS DECIMAL(18,2))) AS NUMERIC(6,2)) AS fileSpaceUsedPercent
,'-----' AS separator
,d2.[total_size_mb] AS totalDbSizeMB
--,d2.[total_size_mb] AS totalDbSizeMB
,REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, [d2].[total_size_mb]), 1),',',''''),'.00','') as totalDbSizeMB
,'USE '+d.name+';
DBCC SHRINKFILE (N'''+f.[name]+''' , 0, TRUNCATEONLY);
GO
@@ -65,28 +73,31 @@ GO
' AS reorganizeData
,'USE '+d.name+';
IF 1024 < '+CAST(CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS VARCHAR(15))+' --file is above 1Go
AND 95 > '+CAST(CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2))) AS DECIMAL(6,2))AS VARCHAR(15))+' --and usage below 95%
AND 0 < '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS DECIMAL(16,2))AS VARCHAR(15))+' --and data are present
IF '+CAST(@limit AS VARCHAR(10))+' < '+CAST(CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2)) AS VARCHAR(15))+' --file is above limit
AND 95 > '+CAST(CAST(([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB]) * 100 / (CAST([F].[size] * 8.0 / 1024 AS DECIMAL(18,2))) AS DECIMAL(6,2))AS VARCHAR(15))+' --and file container usage below 95%
AND 0 < '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] AS DECIMAL(16,2))AS VARCHAR(15))+' --and data are present
AND '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] + @limit AS DECIMAL(18,0)) AS VARCHAR(15))+' < '+CAST(CAST([fs].[CurrentSizeMB] AS DECIMAL(18,0)) AS VARCHAR(15))+' --target size is smaller than current size
BEGIN
--print ''Reorganize '+d.name+'.'+f.name+' ''
RAISERROR(''Reorganize '+d.name+'.'+f.name+' '',0,0) WITH NOWAIT
DBCC SHRINKFILE (N'''+f.[name]+''' , '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] + 1024 AS DECIMAL(18,0)) AS VARCHAR(15))+');
DBCC SHRINKFILE (N'''+f.[name]+''' , '+CAST(CAST([fs].[CurrentSizeMB] - [fs].[FreeSpaceMB] + @limit AS DECIMAL(18,0)) AS VARCHAR(15))+');
RAISERROR(''Done'',0,0) WITH NOWAIT
END
GO
' AS auto_action
FROM sys.master_files F
JOIN sys.databases d ON d.[database_id] = f.[database_id]
JOIN [#dbs] [d2] ON d2.[database_name] = d.[name]
LEFT JOIN [#FileSize] fs ON fs.[FileName] = f.name AND fs.[dbName] = d.[name]
JOIN [#dbs] [d2] ON [d2].[database_name] = d.[name]
LEFT JOIN [#FileSize] fs ON [fs].[FileName] = f.name AND [fs].[dbName] = d.[name]
WHERE f.type_desc IN (
'ROWS' --mdf
--,'LOG'
--,
--'LOG'
)
--AND f.[physical_name] LIKE 'f%'
--AND d.[is_read_only] = 0
--AND [F].[physical_name] LIKE 'd:%'
AND d.[is_read_only] = 0
AND [d].[source_database_id] IS NULL
--AND d.[is_auto_shrink_on] = 0
--AND d.name='sl2007'
AND d.name NOT IN (
@@ -96,6 +107,7 @@ AND d.name NOT IN (
,'msdb'
)
ORDER BY [d2].[row_size_mb] DESC, d.name DESC, f.name ASC ;
--ORDER BY [fileSpaceUsedPercent] ASC;
--free disk space
SELECT