Размер "кучи", слишком большой для существующих данных

База данных SQL Server 2008 R2 Standard Edition имеет таблицу подготовки без индексов, восемь varchar(50) и один varchar(255) столбцы и 162 676 строк. Я ожидал бы, что эта таблица не должна составлять намного более чем 100 МБ в размере, однако это на самом деле превышает 7,5 ГБ.

Что может вызвать это? Я подозреваю, что могу заставить проблему уйти путем добавления кластерного индекса или воссоздания таблицы полностью, но я хочу понять то, что продолжается, который заставляет одну таблицу подготовки расшириться к таким смешным пропорциям. Вот то, что я собрал как подходящие данные до сих пор:

sys.dm_db_index_physical_stats (DETAILED)
    fragment_count = 1056
    page_count = 964392
    forwarded_record_count = 0

sp_spaceused @objname = 'db.schema.table',@updateusage = 'TRUE'
    reserved = 7716888 KB
    data = 7715136 KB
    index_size = 24 KB
    unused = 1728 KB

sys.allocation_units
    total_pages = 964611
    used_pages = 964395
    data_pages = 964392

Кто-либо может сказать мне, почему эта таблица занимает так много места?

4
03.10.2012, 01:32
2 ответа

Возможности состоят в том, что много данных было обновлено или удалено, или Вы скорректировали размер некоторых Ваших столбцов, или Вы имеете усеченный / удалил таблицу и много раз перезагружал. Некоторые из этих операций могут привести к неисправленному пространству в некоторых сценариях. Я попробовал бы это сначала:

ALTER TABLE schema.table REBUILD;

Затем я рассмотрел бы добавление кластерного индекса.

4
22.02.2020, 22:42
  • 1
    Тот синтаксис в новинку для SQL Server 2008? Я никогда не видел его! –  Max Vernon 03.10.2012, 01:26

Возможности являются физической сервировкой, весьма отличается от логического расположения. Это специально верно с подготовкой таблиц. См. столбцы таблицы SQL Server под капотом для получения дополнительной информации, включая запрос, который покажет физическое расположение:

select p.index_id, p.partition_number,
    pc.leaf_null_bit,
    coalesce(cx.name, c.name) as column_name,
    pc.partition_column_id,
    pc.max_inrow_length,
    pc.max_length,
    pc.key_ordinal,
    pc.leaf_offset,
    pc.is_nullable,
    pc.is_dropped,
    pc.is_uniqueifier,
    pc.is_sparse,
    pc.is_anti_matter
from sys.system_internals_partitions p
join sys.system_internals_partition_columns pc
    on p.partition_id = pc.partition_id
left join sys.index_columns ic
    on p.object_id = ic.object_id
    and ic.index_id = p.index_id
    and ic.index_column_id = pc.partition_column_id
left join sys.columns c
    on p.object_id = c.object_id
    and ic.column_id = c.column_id
left join sys.columns cx
    on p.object_id = cx.object_id
    and p.index_id in (0,1)
    and pc.partition_column_id = cx.column_id
where p.object_id = object_id('...')
order by index_id, partition_number;
3
22.02.2020, 22:42

Теги

Похожие вопросы