Размер файла MDF намного больше, чем фактические данные - PullRequest
6 голосов
/ 17 августа 2010

По какой-то причине мой файл MDF составляет 154 гигабайта, однако я загружал только 7 гигабайт данных из плоских файлов.Почему файл MDF намного больше, чем фактические исходные данные?

Дополнительная информация:

Только несколько таблиц с ~ 25 миллионами строк.Нет больших полей varchar (самое большое 300, большинство меньше varchar (50). Не очень широкие таблицы <20 столбцов. Кроме того, ни одна из больших таблиц еще не проиндексирована. Таблицы с индексами имеют менее 1 миллиона строк.Для строк не используется char, только varchar. Тип данных не является проблемой. </p>

Оказалось, что это был файл журнала, а не файл mdf. Файл MDF на самом деле составляет 24 гигабайта, что кажется более разумным, однако все еще большим IMHO.

ОБНОВЛЕНИЕ:

Я исправил проблему с файлом LDF (log), изменив модель восстановления с FULL на простую. Это нормально, потому что этот сервер используется только для внутренней разработки и обработки ETLКроме того, перед тем, как перейти к SIMPLE, мне пришлось сжать файл LOG. Сжатие не рекомендуется в большинстве случаев, однако это был один из тех случаев, когда файл журнала никогда не должен был расти настолько большим и быстрым. это

Ответы [ 4 ]

4 голосов
/ 17 августа 2010

Поскольку MDF был выделен с 154Gb, или вырос до 154Gb в результате различных операций.Файл базы данных имеет как минимум размер данных в нем, но он может быть больше, чем использованное количество на любую сумму.

Очевидным вопросом будет как выизмерить количество данных в базе данных ?Вы использовали sp_spaceused?Вы проверяли sys.allocation_units?Вы догадались?

Если используемый размер действительно равен 7 ГБ из 154 ГБ, то вы должны оставить его как есть.База данных была кем-то измерена в таком размере или выросла, и она, вероятно, вырастет снова.Если вы считаете, что рост или предварительный размер были случайными, то предыдущий пункт все еще применяется, и вы должны оставить его как есть.

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

3 голосов
/ 17 августа 2010

Может быть много причин, может быть, вы используете char (5000) вместо varchar (5000), возможно, вы используете bigints вместо int, nvarchar, когда все, что вам нужно, это varchar и т. Д. индексов на таблицу, все они будут складываться. Может быть, ваши настройки автогроя неверны. Вы уверены, что это MDF, а не файл LDF, верно?

1 голос
/ 19 апреля 2018

На всякий случай, если это будет полезно для кого-то, кто нашел этот запрос в dba.stackexchange, он использует sys.dm_db_database_page_allocations, который подсчитывает количество страниц на объект, включает внутреннее хранилище и дает реальный обзор пробелов. используется вашей базой данных.

SELECT sch.[name], obj.[name], ISNULL(obj.[type_desc], N'TOTAL:') AS [type_desc],
       COUNT(*) AS [ReservedPages],
       (COUNT(*) * 8) AS [ReservedKB],
       (COUNT(*) * 8) / 1024.0 AS [ReservedMB],
       (COUNT(*) * 8) / 1024.0 / 1024.0 AS [ReservedGB]
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, DEFAULT) pa
INNER JOIN sys.all_objects obj
        ON obj.[object_id] = pa.[object_id]
INNER JOIN sys.schemas sch
        ON sch.[schema_id] = obj.[schema_id]
GROUP BY GROUPING SETS ((sch.[name], obj.[name], obj.[type_desc]), ())
ORDER BY [ReservedPages] DESC;

Спасибо Соломону Руцки:

https://dba.stackexchange.com/questions/175649/sum-of-table-sizes-dont-match-with-mdf-size

0 голосов
/ 17 августа 2010

Либо АВТО СЖЕТАНИЕ не включено, либо для начального размера было установлено большее значение.

...