2011-02-07 2 views
1

Я пытаюсь определить, работоспособна ли база данных SQL Server.Размер данных базы данных отличается от суммы всех таблиц в SQL Server

Я проверил несколько команд, чтобы проверить размер, и я был потрясен различиями между суммой размеров таблиц и размером базы данных.

Мне интересно, почему существует такая разница в размере.

EXEC sp_spaceused @updateusage = N'TRUE'; 

database_name | database_size | unallocated space 
FleetEquip |1357.00 MB  |0.20 MB 

и

EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'" 

(слишком много форматирования, чтобы включить все таблицы - HTML-таблица будет хорошо)

name   | rows | reserved(KB) | data(KB) | index_size(KB) | unused(KB) 
EquipmentState | 131921 | 40648  | 40608 | 8    | 32 

сумма всех таблиц доходит до 45768 КБ

ответ

3

Вы можете посмотреть на определение sp_spaceused с EXEC sp_helptext 'sp_spaceused'

Хотя я предпочитаю формат результата, возвращенный следующий фактически:

select object_definition(object_id('sp_spaceused')) as [processing-instruction(x)] FOR XML PATH

Вы можете попробовать ниже (на основе совокупного запроса он содержит) и посмотреть, где лежит несоответствие?

select OBJECT_NAME(p.object_id), 
reservedpages = sum(a.total_pages), 
    usedpages = sum(a.used_pages), 
    pages = sum(
      CASE 
       -- XML-Index and FT-Index internal tables are not considered "data", but is part of "index_size" 
       When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0 
       When a.type <> 1 Then a.used_pages 
       When p.index_id < 2 Then a.data_pages 
       Else 0 
      END 
     ) 
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id 
    left join sys.internal_tables it on p.object_id = it.object_id 
GROUP BY p.object_id 
with rollup 
-1

MSSQL выделяет память по мере необходимости для своих таблиц ... Однако при удалении строк БД не «сжимается». Это похоже на DOS, где вам иногда нужно «дефрагментировать» диск. Есть инструменты, которые позволяют вам дефрагментировать/сжать db, если это необходимо.

+0

память? вы имеете в виду дисковое пространство, верно? –

+0

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

+1

Также @John K. Я получаю впечатление от чтения ваших ответов, что вы ничего не знаете о SQL, но просто google много ... подумайте, прежде чем отправлять ответы – JNK