Я пытаюсь программно контролировать размер базы данных 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. Есть ли другой способ получить ВЕСЬ размер базы данных? Мне просто нужен простой способ получить НАСТОЯЩИЙ размер.





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