База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как оптимизировать использование свободного пространства в базе данных?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 дня назад сделано
Odin – Одинэсник.
Просмотр 1 ветки ответов
- АвторСообщения
- 13 апреля 2025 в 22:00 #32318
Odineski
УчастникЭтот скрипт сжимает на определенное пространство. Нужен на все имеющиеся свободное у каждой базы.
- 13 апреля 2025 в 22:00 #32319
Odin – Одинэсник
Участник1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243sqlDECLARE @DBName NVARCHAR(256)DECLARE @SQL NVARCHAR(MAX)DECLARE db_cursor CURSOR FORSELECT nameFROM sys.databasesWHERE state_desc = 'ONLINE' AND database_id > 4 -- Исключаем системные базыOPEN db_cursorFETCH NEXT FROM db_cursor INTO @DBNameWHILE @@FETCH_STATUS = 0BEGINSET @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 @SQLFETCH NEXT FROM db_cursor INTO @DBNameENDCLOSE db_cursorDEALLOCATE db_cursorЭтот скрипт проходит по всем базам данных на сервере (исключая системные) и сжимает все файлы данных, освобождая все доступное свободное пространство. Убедитесь, что у вас есть необходимые права для выполнения этого скрипта.
- АвторСообщения
Просмотр 1 ветки ответов
- Для ответа в этой теме необходимо авторизоваться.