База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как оптимизировать использование свободного пространства в базе данных? › RE: Как оптимизировать использование свободного пространства в базе данных?
		13 апреля 2025 в 22:00
		
		#32319
		
		
		
	
 Odin — Одинэсник
Odin — ОдинэсникУчастник
		
		
	1С (Код)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | sql DECLARE @DBName NVARCHAR(256) DECLARE @SQL NVARCHAR(MAX) DECLARE db_cursor CURSOR FOR SELECT name  FROM sys.databases  WHERE state_desc = 'ONLINE' AND database_id > 4 -- Исключаем системные базы OPEN db_cursor FETCH NEXT FROM db_cursor INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN     SET @SQL = 'USE [' + @DBName + ']; ' +                 'DECLARE @FileName NVARCHAR(256); ' +                 'DECLARE @FreeSpaceMB DECIMAL(12,2); ' +                 'DECLARE @CurrentSizeMB DECIMAL(12,2); ' +                 'DECLARE @StopSizeMB INT = 0; ' + -- Устанавливаем порог для остановки                 'DECLARE file_cursor CURSOR FOR ' +                 'SELECT name FROM sys.master_files WHERE database_id = DB_ID(); ' +                 'OPEN file_cursor; ' +                 'FETCH NEXT FROM file_cursor INTO @FileName; ' +                 'WHILE @@FETCH_STATUS = 0 ' +                 'BEGIN ' +                 'SET @FreeSpaceMB = (SELECT CAST((size * 8) / 1024 AS DECIMAL(12,2)) - CAST(FILEPROPERTY(@FileName, ''SpaceUsed'') AS DECIMAL(12,2)) / 128 AS DECIMAL(12,2)); ' +                 'SET @CurrentSizeMB = (SELECT CAST(size * 8 / 1024 AS DECIMAL(12,2)) FROM sys.master_files WHERE name = @FileName AND database_id = DB_ID()); ' +                 'IF @FreeSpaceMB > @StopSizeMB ' +                 'BEGIN ' +                 'PRINT ''Shrinking file: '' + @FileName + '' from '' + CAST(@CurrentSizeMB AS NVARCHAR(10)) + '' MB to '' + CAST(@CurrentSizeMB - @FreeSpaceMB AS NVARCHAR(10)) + '' MB''; ' +                 'DBCC SHRINKFILE(@FileName, @CurrentSizeMB - @FreeSpaceMB); ' +                 'END; ' +                 'FETCH NEXT FROM file_cursor INTO @FileName; ' +                 'END; ' +                 'CLOSE file_cursor; ' +                 'DEALLOCATE file_cursor;'     EXEC sp_executesql @SQL     FETCH NEXT FROM db_cursor INTO @DBName END CLOSE db_cursor DEALLOCATE db_cursor | 
Этот скрипт проходит по всем базам данных на сервере (исключая системные) и сжимает все файлы данных, освобождая все доступное свободное пространство. Убедитесь, что у вас есть необходимые права для выполнения этого скрипта.
