2008-12-08 2 views
0

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

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

ответ

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.

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

Diego

1

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

+0

хмм ... что это хорошая идея! – pearcewg 2008-12-08 15:58:57

0

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

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

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

Кроме того, из одной и той же страницы в книгах по линии

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

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

Смотрите также "SQL Server Books Online sp_spaceused (Transact-SQL)"

Смежные вопросы