Подтвердить что ты не робот

Размер одной записи? SQL

У меня есть сценарий, где каждому пользователю выделено 2 МБ пространства базы данных. Теперь я должен показать использование Percenatge своего выделенного пространства, для этого мне нужно знать размер одной записи в таблице.

Я попытался использовать sp_spaceused и даже написал пользовательскую процедуру, использующую datalength.. но они показывают огромную разницу в их результате.

Есть ли способ сделать это правильно.

4b9b3361

Ответ 1

Запустите DBCC SHOWCONTIG с именем вашей таблицы

dbcc showcontig ('TableName') with tableresults

затем просмотрите максимальный минимальный и средний размер записи

Ответ 2

В следующем запросе будет указан процент @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

Ответ 3

Поскольку showcontig будет устаревшим, вы также можете использовать:

SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')

Ответ 4

Вы можете рассчитать размер строки (числа строк) с довольно сложной формулой. См. Электронная почта в Интернете (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

Ответ 5

Данные сохраняются на диске в каталогах, названных для базы данных. Это включает в себя все, включая то, что вы не измеряете (индексы и т.д.). Измерьте это.