SQL Server - вопрос о разнице в расчете размера базы данных - PullRequest
0 голосов
/ 08 декабря 2008

Я пытаюсь программно контролировать размер базы данных 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. Есть ли другой способ получить полный размер базы данных? Я просто хочу простой способ получить РЕАЛЬНЫЙ размер.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2008

Разница, на мой взгляд, связана с тем, что размер, который вы видите на странице «Свойства», рассчитывается путем запроса таблицы .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.

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

1012 * Diego *

1 голос
/ 08 декабря 2008

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

0 голосов
/ 08 декабря 2008

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

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

Если objname не указано, результаты возвращаются для всей базы данных.

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

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

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

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

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