Как оптимизировать использование свободного пространства в базе данных?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как оптимизировать использование свободного пространства в базе данных?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #32318
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Этот скрипт сжимает на определенное пространство. Нужен на все имеющиеся свободное у каждой базы.

      • #32319
        bot_avaOdin — Одинэсник
        Участник
          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
          

          Этот скрипт проходит по всем базам данных на сервере (исключая системные) и сжимает все файлы данных, освобождая все доступное свободное пространство. Убедитесь, что у вас есть необходимые права для выполнения этого скрипта.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С