Следующий запрос сообщит вам процент @SpaceAllotted, который используется данными, посмотрев, сколько страниц выделено объектами базы данных.
Не стоит пытаться измерять использование на уровне строк, поскольку SQL Server выделяет все пространство на уровне экстентов. Каждый экстент состоит из восьми страниц данных по 8 КБ. Поэтому, если в вашей базе данных есть только одна строка, а в этой строке 4 байта данных, для размещения этих 4 байтов все равно потребуется весь экстент (или будет использоваться существующий экстент с нераспределенными страницами. Это называется смешанным экстентом). ).
DECLARE @SpaceAllotted FLOAT
-- 2MB converted to kilobytes...
SET @SpaceAllotted = 2048
SELECT
-- Allocation is done on the extent-level.
-- Each extent contains eight 8KB data pages.
((1 / (@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT) / 8) * 64) * 100 AS PercentageUsed
FROM
[sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips
-- This will allow us to retrieve the page count of all tables in the
-- current database, regardless of whether or not they have clustered
-- indexes and/or non-clustered indexes.
INNER JOIN
[sys].[indexes] i
ON
[ips].[object_id] = [i].[object_id]
AND [ips].[index_id] = [i].[index_id]
Так как у нас есть возможность смешанных экстентов, и нет хорошего способа (есть способы, но они не будут симпатичными) для определения того, какие страницы выделены каким экстентам, это не 100% точный Кроме того, экстенты могут даже иметь свободные страницы (которые зарезервированы и поэтому все еще занимают место на диске), поэтому, как правило, эта оценка всегда будет низкой. Тем не менее, это, вероятно, лучшее, что вы получите, не написав что-либо для проверки базы данных на уровне страницы.
Ах да, глядя на другие ответы, это еще один вариант. Это будет в основном смотреть на весь текущий размер файлов данных на страницах и определять процент занимаемого ими пространства. Здесь также есть предостережения ...
- Если для базы данных не указан максимальный размер (автоматическое наращивание включено и неограниченно), это не будет выполняться, поскольку max_size будет возвращено как -1 .
- Опять же, мы не можем точно определить, сколько места используется фактическими данными. Здесь мы рассмотрим, сколько места фактически используется в файловой системе.
- Мы не смотрим на пространство файла журнала. Да, это все еще занимает дисковое пространство.
Надеюсь, что один из них решит вашу проблему.
SELECT
((1 / CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed
FROM
[sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs
INNER JOIN
[sys].[database_files] df
ON
[vfs].[file_id] = [df].[file_id]
WHERE
[df].[type] = 0