SQL Server - вопрос о разнице в вычислении размера базы данных

Я пытаюсь программно контролировать размер базы данных SQL Server, чтобы мой раздел администратора моего веб-приложения мог сообщить об этом, и я могу использовать это для выполнения некоторых SP для очистки, для очистки файлов журналов и т. д.

Я использую следующий код для расчета размера таблиц в соответствии с рекомендацией SO:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?'''-- SELECT * FROM #t ORDER BY name-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY nameSELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM
#tDROP TABLE #t

Когда я запускаю это с моей небольшой образцовой базой данных, я получаю общее суммарное значение ~ 6,8 мегабайт. Когда я смотрю на свойства своей базы данных, она показывает 15,5 мегабайт.

У меня следующие вопросы:
1. Что еще может компенсировать разницу?
2. Можно ли описать эту разницу как «накладные расходы», которые будут расти лишь на небольшую часть темпа по мере роста других данных (для этого мне нужна приблизительная оценка) .
3. Хранимые процедуры, функции, представления, триггеры находятся в этом «служебном» пространстве? Есть ли способ их вычислить?
4. Есть ли другой способ получить ВЕСЬ размер базы данных? Мне просто нужен простой способ получить НАСТОЯЩИЙ размер.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 302
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

На мой взгляд, разница связана с тем, что размер, который вы видите на странице «Свойства», вычисляется путем запроса таблицы .sys.database_files, которая подсчитывает количество страниц размером 8 КБ, выделенных каждым файлом базы данных.

Чтобы получить тот же результат, просто выполните следующий запрос (SQL Server 2005):

SELECT
  SUM([size] * 8) / 1024  AS DB_Size -- Field "size" contains the number of 8 KB pages contained in each file
FROM
  [db_name_here].sys.database_files

Дополнительная информация о sys.database_files на сайте MSDN.

Надеюсь это поможет. :)

Диего

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

Просто быстрое наблюдение, ваш скрипт, кажется, суммирует только столбец данных sp_spaceused, а не зарезервированный столбец (зарезервировано = данные + индекс + неиспользованный). Также sp_msforeachtable не включает системные таблицы.

Также из электронной документации по SQL Server для sp_spaceused

If objname is not specified, results are returned for the whole database.

Также с той же страницы в онлайн-книгах

database_size will always be larger than the sum of reserved + unallocated space because it includes the size of log files, but reserved and unallocated_space consider only data pages.

И еще кое-что, что вам может понадобиться запустить DBCC UPDATEUSAGE, чтобы получить точные цифры.

См. Также «Электронная документация по SQL Server sp_spaceused (Transact-SQL) "

Другие вопросы по теме