2015-12-20 59 views
0

后,我最近尝试清洁桌子。该表是40GB大,索引空间是400MB。从表中删除了很多记录后,它减少到4GB,但索引空间仍然是大约400MB。我认为这可能是因为索引碎片时,我删除记录,然后我重建索引,但索引空间仍然是398MB。我不明白,如果表格大小减少了10倍,为什么索引空间不会按比例减少?SQL索引空间不会降低删除数据从表

指数的构建

ALTER TABLE [CADIS_PROC].[DC_UPPREBBO_INFO_VALUE] 
ADD PRIMARY KEY CLUSTERED ( 
[CADIS_ID] ASC, 
[SOURCE] ASC, 
[SOURCE_KEY] ASC, 
[FILE_DATE] ASC)WITH 
(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

脚本重建索引

ALTER INDEX IndexName ON Schema.Table 
REBUILD; 
GO 

我如何检查索引碎片,我也对对点击桌子上看到它的财产,它显示的大小表和索引空间。

SELECT index_id, name, avg_fragmentation_in_percent 
FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(), NULL, NULL, NULL) 

该索引是表中唯一的索引,它是碎片的0.8%。

+0

当你说你重建索引时,你究竟做了什么?你也可以提供有关索引的任何细节,因为这也有帮助。 –

+0

索引创建如下 ALTER TABLE [CADIS_PROC]。[DC_UPPREBBO_INFO_VALUE] WITH(PAD_INDEX ADD聚集主键 ( [CADIS_ID] ASC, [SOURCE] ASC, [SOURCE_KEY] ASC, [FILE_DATE] ASC )= OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,IGNORE_DUP_KEY = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] GO' 我使用SQL Management Studio中的选项来重建索引[链接](https://msdn.microsoft.com/en-us /library/ms189858.aspx) – JOHN

+0

您是否还可以包含用于报告空间使用情况的命令。顺便说一句,你可能想编辑你的原始问题以提供这些信息。 –

回答

1

聚簇索引该表。表中的数据按聚簇索引定义的顺序物理存储。

如果该表只有聚簇索引并且没有非聚簇索引,我认为索引空间几乎为零。

我有一个只有聚集索引的表。 SSMS显示:

Data space = 3,215.539 MB 
Index space = 5.211 MB  (not zero, but pretty close) 

每个夜晚系统重建使用此命令索引:

ALTER INDEX ALL ON <table name> REBUILD PARTITION = ALL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, ONLINE = OFF, SORT_IN_TEMPDB = ON) 

尝试它,而不是指定索引的名字。

要测量表使用的磁盘空间,请尝试使用sp_spaceused。 它有一个参数@updateusage,这可能很有用。

尝试运行这样的过程:

EXEC sp_spaceused @objname = N'[dbo].[TableName]', @updateusage = N'TRUE' 

这个存储过程MSDN文章有这样一个字条:

当删除或重建大型索引,或者删除或截断大 表,数据库引擎将推迟实际的页面释放,并将其相关的锁定,直到事务提交后。推迟的 删除操作不会立即释放分配的空间。因此, sp_spaceused在丢弃后立即返回的值或截断大对象的 可能不会反映可用的实际磁盘空间 。有关延期分配的更多信息,请参阅 删除和重建大型对象。

看看相关文章Dropping and Rebuilding Large Objects以及。

0

意识到,一个聚集索引是建立与不同于非聚集索引实际的数据页。这可能是值得尝试删除,然后重新创建索引,而不是使用REBUILD看看有什么影响。

MSDN here

在指数

减少不成引用当一个索引的方式,碎片被 影响查询性能支离破碎,有三种选择减少 碎片:

  1. 删除并重新创建聚簇索引。

重新创建聚集索引重新分配数据和结果在 完整的数据页面。可以使用CREATE INDEX中的 FILLFACTOR选项来配置充满程度。此方法的缺点是 索引在丢弃和重新创建周期期间处于脱机状态,并且 操作是原子性的。如果索引创建中断,则 索引不会重新创建。有关更多信息,请参阅CREATE INDEX (Transact-SQL)。

  • 使用ALTER INDEX REORGANIZE,更换为DBCC INDEXDEFRAG,到 重新排序索引的叶级页按逻辑顺序。 因为这是一个在线操作,所以在 语句正在运行时索引可用。如果没有 已经完成失败的工作,操作也可能中断。在这种方法的缺点是,它 不会做重组数据作为索引重建 操作的好工作,而且不更新逻辑顺序的 指数statistics.reorder叶级页。

  • 使用ALTER INDEX REBUILD替换DBCC DBREINDEX,以联机或脱机重建 索引。有关更多信息,请参阅ALTER INDEX(Transact-SQL)。

  • 您已经尝试#3,如果你的实际可能要考虑1或2有瓜葛的效果。如果您只是试图了解观察到的行为,请在可以重建其数据库的开发/测试服务器上使用数据库副本(或至少相关的表)。您也可以尝试仅使用非聚集索引进行比较。

    就我个人而言,我一直怀疑任何报表工具对聚集索引的索引性能和空间利用率都有所怀疑,因为它们必须区分索引和共享相同分配空间的数据。

    +0

    我也试过重组,我读了一些[测试](http://sqlstudies.com/2014/12/11/drop-index-and-create-index-vs-alter-index-rebuild/)说有聚集索引上的drop和recreate与重建没有区别。 我不明白的是,为什么当我删除行时,索引空间与实际表大小的减少成比例地减少,而索引没有分片。 – JOHN