SQL Server - возможно ли найти размер, фактически используемый в файле MDF или LDF?

При добавлении .MDF (.NDF) или же .LDF файл на SQL Server, у нас есть возможность установить его начальный размер, автоматический рост и увеличение (в процентах или абсолютное значение).

После того, как база данных некоторое время работает, можно ли определить, сколько фактического размера используется данными? Например, если фактический размер файла составляет 5 МБ, но для хранения данных используется только 2 МБ, файл все равно может занять 3 МБ данных, прежде чем его нужно будет увеличить.

Мне нужен способ узнать "2M" (используемый размер) в общем текущем размере (5M) файла.

5 ответов

После некоторых исследований я заметил FILEPROPERTY функция.

SELECT FILEPROPERTY(name, 'SpaceUsed') spaceUsed, * 
FROM sysfiles

Похоже, что дает мне, сколько используется в текущем размере файла. Например, если текущий размер файла 5M, FILEPROPERTY() может дать мне 2M, что означает, что файл может по-прежнему занимать 3M данных, прежде чем он должен расти.

Если кто-то может подтвердить со мной, я отмечу это как ответ.

sys.database_files (Transact-SQL)
Содержит строку для каждого файла базы данных, которая хранится в самой базе данных. Это представление для каждой базы данных....

size     | int | Current size of the file, in 8-KB pages.
         |     | For a database snapshot, size reflects the maximum space that the snapshot can ever use for the file.
---------+-----+------------------------------------------------
max_size | int | Maximum file size, in 8-KB pages.
         |     | Databases that are upgraded with an unlimited log file size will report -1 for the maximum size of the log file.

а также

FILEPROPERTY (Transact-SQL) Возвращает указанное значение свойства имени файла, когда указаны имя файла и имя свойства....

SpaceUsed | Amount of space that is used by the specified file. | Number of pages allocated in the file

Используйте их так:

SELECT 
    name, 
    size, 
    FILEPROPERTY(name, 'SpaceUsed') AS SpaceUsed, 
    size - FILEPROPERTY(name, 'SpaceUsed') As UnusedSize
FROM 
    sys.database_files

Как найти размер файла журнала SQL (.ldf)

DECLARE @command varchar(1000)
SELECT @command = 'USE ? select [Name], physical_name [Path], 
CAST(size AS BIGINT)*8192 [TotalBytes], 
CAST(FILEPROPERTY(name,''SpaceUsed'') AS BIGINT)*8192 [UsedBytes], 
(case when max_size<0 then -1 else CAST(max_size AS BIGINT)*8192 end) [MaxBytes]
from sys.database_files'
Declare @dtTable table
(
[Name] varchar(max), 
physical_name varchar(max), 
[TotalBytes] varchar(max),
[UsedBytes] varchar(max),
[MaxBytes] varchar(max)
)
insert into @dtTable EXEC sp_MSforeachdb @command 
select * from @dtTable where physical_name like '%.ldf'
select * from @dtTable where physical_name like '%.mdf'

Если вы создали базу данных с вашим собственным конкретным параметром начального размера, то НЕТ, узнать об этом невозможно, если только вы не написали сценарий создания базы данных.

Иначе, как правило, начальный размер по умолчанию считается таким же, как model база данных. Итак, если это по умолчанию, то вы можете проверить с помощью model начальный размер базы данных, который обычно 3MB

Кто-то исправит меня, если я ошибаюсь, но для файла данных, я считаю, * несжатая резервная копия должна примерно соответствовать фактическому объему данных в файле. Например, если база данных составляет 2 ГБ, а резервная копия - 1 ГБ, у вас есть ~1 ГБ данных. Что касается журнала вы самостоятельно.

Другие вопросы по тегам