Ответ 1
Запустите DBCC SHOWCONTIG с именем вашей таблицы
dbcc showcontig ('TableName') with tableresults
затем просмотрите максимальный минимальный и средний размер записи
У меня есть сценарий, где каждому пользователю выделено 2 МБ пространства базы данных. Теперь я должен показать использование Percenatge своего выделенного пространства, для этого мне нужно знать размер одной записи в таблице.
Я попытался использовать sp_spaceused и даже написал пользовательскую процедуру, использующую datalength.. но они показывают огромную разницу в их результате.
Есть ли способ сделать это правильно.
Запустите DBCC SHOWCONTIG с именем вашей таблицы
dbcc showcontig ('TableName') with tableresults
затем просмотрите максимальный минимальный и средний размер записи
В следующем запросе будет указан процент @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% точно. Кроме того, экстенты могут содержать даже свободные страницы (которые зарезервированы и, следовательно, все еще занимают дисковое пространство), так что обычно эта оценка всегда будет низкой. Тем не менее, это, вероятно, лучшее, что вы получите, не написав что-то для проверки базы данных на уровне страницы.
А да, глядя на другие ответы, это еще один вариант. Это будет в основном смотреть на весь текущий размер файлов данных на страницах и определять процентное пространство, которое они потребляют. Теперь здесь есть оговорки...
Надеюсь, что одна из этих проблем решает вашу проблему.
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
Поскольку showcontig будет устаревшим, вы также можете использовать:
SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')
Вы можете рассчитать размер строки (числа строк) с довольно сложной формулой. См. Электронная почта в Интернете (ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f -4c2c-8ba0-6c483cea6c75.htm) для получения точных данных.
Короче:
Возьмите количество столбцов и определите размер каждого столбца по его типу данных для типов данных фиксированной длины.
Вычислить пространство, используемое для любых нулевых столбцов Затем вычислите пространство строк:
Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4
Данные сохраняются на диске в каталогах, названных для базы данных. Это включает в себя все, включая то, что вы не измеряете (индексы и т.д.). Измерьте это.