Размер одной записи? SQL - PullRequest
15 голосов
/ 21 апреля 2009

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

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

Есть ли какой-нибудь способ исправить эту вещь?

Ответы [ 5 ]

25 голосов
/ 21 апреля 2009

Выполнить DBCC SHOWCONTIG с вашим именем таблицы

dbcc showcontig ('TableName') with tableresults

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

12 голосов
/ 26 сентября 2012

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

SELECT * FROM sys.dm_db_index_physical_stats
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED')
12 голосов
/ 12 мая 2009

Следующий запрос сообщит вам процент @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
10 голосов
/ 21 апреля 2009

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

1 голос
/ 21 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...