SQL Сервер - удалены все строки в таблице (не усечены), но после сжатия пространство не уменьшается - PullRequest
1 голос
/ 21 января 2020

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

Тем не менее, я все еще вижу исходный размер таблицы (60 ГБ), даже при наличии 0 строк. Если взглянуть дальше, индекс NULL (я думаю, что это означает неиндексированный, поэтому используется PK) занимает 30 ГБ и 30 ГБ «свободного пространства» для этой таблицы.

Как мне вернуть индексное пространство и "Свободное пространство" обратно в 0 ГБ?

Спасибо! Аллен

Ответы [ 2 ]

1 голос
/ 21 января 2020

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

create table dbo.myheap
(
id int identity,
col char(500) not null
);
go


insert into dbo.myheap(col)
select top (10000) a.name
from master.dbo.spt_values as a
cross join master.dbo.spt_values as b;
go


exec sp_spaceused 'dbo.myheap' --myheap 10000       5384 KB 5336 KB 8 KB    40 KB
go

--delete all rows
delete dbo.myheap;
go

--space is not freed
exec sp_spaceused 'dbo.myheap' --myheap 0           5384 KB 5336 KB 8 KB    40 KB
go


--from heap to clustered
create clustered index clxheaptocluster on dbo.myheap(id);
go

exec sp_spaceused 'dbo.myheap' --myheap 0           0 KB    0 KB    0 KB    0 KB
go

--cleanup
drop table dbo.myheap
go

Для кластеризованных таблиц перестройте кластеризованный индекс (или ВСЕ):

ALTER INDEX ALL /*clusteredindexname*/ ON dbo.myclusteredtable REBUILD;
0 голосов
/ 21 января 2020

щелкните правой кнопкой мыши по db.click на properties, затем files. Обратите внимание на файл журнала initial size.

...