我在数据库中有一个表,其大小在一个月内增长了 15TB。为了做进一步的调查,我使用这个查询来找出哪个列使用了更多的页面。
SELECT SUM(DATALENGTHG(column1)),
SUM(DATALENGTHG(column1)),
...
FROM my_table_name
单个列为 14TB。删除列后,我使用下面的查询来确保数据文件现在为空:
SELECT
OBJECT_SCHEMA_NAME(Parti.object_id) + '.' + OBJECT_NAME(Parti.object_id) AS TableName,
AU.total_pages/128/1024 AS TotalTableSizeInGB,
AU.used_pages/128/1024 AS UsedSizeInGB,
AU.data_pages/128/1024 AS DataSizeInGB
FROM sys.allocation_units AS AU
INNER JOIN sys.partitions AS Parti ON AU.container_id = CASE WHEN AU.type in(1,3) THEN Parti.hobt_id ELSE Parti.partition_id END
LEFT JOIN sys.indexes AS ind ON ind.object_id = Parti.object_id AND ind.index_id = Parti.index_id
inner join sys.objects o on ind.object_id=o.object_id
WHERE 1=1
AND OBJECT_NAME(Parti.object_id) = 'my_table_name'
但我仍然看到相同的大小。我尝试备份日志文件。还尝试了 CHECKPOINT 并再次备份日志文件。但没有区别。
执行DBCC CLEANTABLE以回收被删除的 varchar 列使用的空间。
重建聚簇索引也会回收空间,但会占用更多资源。
如果您使用
FULL
恢复模式,请确保在操作期间执行日志备份以避免填满日志。DBCC CLEANTABLE
使用 1000 行的默认批处理大小,未指定可选的批处理大小参数。您要查找的命令是:
update statistics
统计数据会自动更新,但不会太频繁。
insert
如果您已对表发出更改( 、update
或delete
),并且更改计数超过 ,则会发生更新number_of_rows_at_last_statistic * 0.2
。如果您需要更频繁地更新 - 手动进行。