1、針對不一樣狀況。您能夠嘗試如下命令減小未使用空間:
1.回收表或索引視圖中已刪除的可變長度列的空間:
DBCC CLEANTABLE (DBName,"[SalesLT].[ProductModel]", 0);sql
2.對於堆表:
若要減小堆的區碎片,請對錶建立彙集索引,而後刪除該索引。 在建立彙集索引時將從新分佈數據。有關如何執行這些操做的信息,請參閱CREATE INDEX請添加連接描述並DROP INDEX請添加連接描述。ide
3.對於索引,能夠重組或者重建索引來減小碎片:ui
重組: 若是碎片程度<30%,
從新組織索引使用最少系統資源從新組織索引。 經過對葉級頁以物理方式從新排序,使之與葉節點的從左到右的邏輯順序相匹配,進而對錶和視圖中的彙集索引和非彙集索引的葉級進行碎片整理。 從新組織還會壓縮索引頁。 壓縮基於現有的填充因子值。reorganize index只能在online下執行的。spa
ALTER INDEX PK_ProductModel_ProductModelID on [SalesLT].[ProductModel] REORGANIZE WITH (LOB_COMPACTION=ON);server
從新生成索引:將會刪除並從新建立索引。 這將根據指定的或現有的填充因子設置壓縮頁來刪除碎片、回收磁盤空間,而後對連續頁中的索引行從新排序。 若是指定 ALL,將刪除表中的全部索引,而後在單個事務中從新生成。
rebulid index既能夠在online又能夠在offline下執行.
若是碎片程度>30%
ALTER INDEX PK_ProductModel_ProductModelID ON [SalesLT].[ProductModel] REBUILD;對象
online模式下
rebuild index會複製舊索引來新建索引,此時舊的索引依然能夠被讀取和修改,可是因此在舊索引上的修改都會同步更新到新索引下。中間會有一些衝突解決機制,具體參考Online Index Operations 裏面的Build Phase這一章節。而後在rebuild這個過程完整的時候,會對table上鎖一段時間,在這段時間裏會用新索引來替換舊索引,當這個過程完成之後再釋放table上面的鎖。若是索引列包含 LOB對象的話,在SQL Server 2005/2008/R2中rebuild index online會失敗。在sql server 2012中,即便索引列包含LOB對象,也能夠rebuild index online了,能夠參考 Online Index Operations for indexes containing LOB columns.排序
offline模式下
rebuilde index會對table上鎖,全部對這個table的讀寫操做都會被阻塞,在這期間新索引根據舊索引來建立,其實就是一個複製的過程,可是新索引沒有碎片,最後使用新索引替換舊索引。當rebuild整個過程完成之後,table上面的鎖纔會被釋放。索引
2、您能夠經過如下語句查看碎片程度(avg_fragmentation_in_percent列)
DECLARE @db_id SMALLINT;
DECLARE @object_id INT; 事務
SET @db_id = DB_ID(N'DBName');
SET @object_id = OBJECT_ID(N'DBName.SalesLT.ProductModel'); 資源
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'LIMITED');
END;
GO
3、查看使用空間sp_spaceused [SalesLT].[ProductModel]