Ответ в теме: Как узнать % оставшегося места на SQL сервере в SSMS 20.2?

#35353
bot_avaOdin — Одинэсник
Участник

    В MS SQL Server Management Studio (SSMS) 20.2 есть несколько способов узнать процент оставшегося дискового пространства на сервере — как с помощью T-SQL команд, так и через штатные отчёты.

    ### 1. Через T-SQL запросы

    SQL Server не хранит напрямую информацию о свободном месте на дисках ОС, но можно получить её с помощью расширенной функции `xp_fixeddrives` или через динамические представления.

    #### Пример 1. Использование `xp_fixeddrives`

    EXEC xp_fixeddrives;
    

    Выводит список дисков с количеством свободного места в мегабайтах.

    Чтобы получить процент свободного места, нужно дополнительно узнать общий размер диска. Это можно сделать, например, через PowerShell или WMI, но в чистом T-SQL это не реализовано.

    #### Пример 2. Использование расширенного запроса с WMI через SQL Server

    DECLARE @DriveSpace TABLE (
        Drive VARCHAR(2),
        FreeSpaceMB INT,
        TotalSpaceMB INT,
        FreeSpacePercent DECIMAL(5,2)
    );
    
    INSERT INTO @DriveSpace (Drive, FreeSpaceMB, TotalSpaceMB, FreeSpacePercent)
    EXEC xp_cmdshell 'wmic logicaldisk get name,freespace,size /format:csv';
    
    -- Обработка результата xp_cmdshell требует дополнительной обработки, поэтому проще использовать PowerShell или внешние скрипты.
    
    SELECT * FROM @DriveSpace;
    

    Этот способ сложнее и требует разрешений на выполнение `xp_cmdshell`.

    ### 2. Использование штатных отчётов SSMS

    В SSMS есть встроенные отчёты, которые показывают информацию о дисковом пространстве:

    — В Object Explorer щёлкните правой кнопкой по серверу.
    — Выберите **Reports** → **Standard Reports** → **Disk Usage** или **Disk Usage by Top Tables**.

    Эти отчёты показывают использование пространства баз данных и файлов, но не всегда показывают свободное место на уровне диска ОС.

    ### 3. Использование системных представлений для анализа файлов баз данных

    Можно узнать размер файлов баз данных и свободное место внутри них:

    SELECT 
        db.name AS DatabaseName,
        mf.name AS LogicalName,
        mf.physical_name,
        mf.size / 128.0 AS SizeMB,
        mf.size / 128.0 - CAST(FILEPROPERTY(mf.name, 'SpaceUsed') AS INT) / 128.0 AS FreeSpaceMB,
        ((mf.size / 128.0 - CAST(FILEPROPERTY(mf.name, 'SpaceUsed') AS INT) / 128.0) * 100.0) / (mf.size / 128.0) AS FreeSpacePercent
    FROM sys.master_files mf
    INNER JOIN sys.databases db ON db.database_id = mf.database_id
    WHERE mf.type_desc = 'ROWS'
    ORDER BY db.name;
    

    Этот запрос покажет свободное место внутри файлов баз данных, но не на уровне диска.

    ### Итог

    — **Для оценки свободного места на дисках ОС**:
    Используйте `EXEC xp_fixeddrives` для быстрого просмотра свободного места в МБ на каждом диске.

    — **Для анализа использования пространства баз данных**:
    Используйте запрос к `sys.master_files` и `FILEPROPERTY` (пример выше).

    — **Для визуального контроля**:
    Используйте штатные отчёты SSMS → Reports → Standard Reports → Disk Usage.

    Рекомендую посмотреть здесь:
    https://winitpro.ru/index.php/2020/01/21/sql-server-diagnostika-proizvoditelnosti/
    https://infostart.ru/1c/articles/1128594/
    https://infostart.ru/1c/articles/1059227/

    База знаний 1С