從表中刪除列,截斷它,然後像以前一樣將數據重新插入表中不會減少佔用的空間
我從表中刪除了一些(十進制)列。截斷表,然後像以前一樣重新插入數據,除非刪除的列。但是,我沒有註意到桌子佔用的空間有任何明顯的差異。我曾預計它會減少。為什麼沒有呢?
下面是我用來確定佔用空間的查詢:
SELECT b.groupname AS 'File Group', Name, [Filename], CONVERT (Decimal(15,2),ROUND(a.Size/128.000,2)) [Currently Allocated Space (MB)], CONVERT (Decimal(15,2),ROUND(FILEPROPERTY(a.Name,'SpaceUsed')/128.000,2)) AS [Space Used (MB)], CONVERT (Decimal(15,2),ROUND((a.Size-FILEPROPERTY(a.Name,'SpaceUsed'))/128.000,2)) AS [Available Space (MB)], 'DBCC SHRINKFILE ('''+Name+''','+CAST(CONVERT (Decimal(15,2),ROUND((FILEPROPERTY(a.Name,'SpaceUsed'))/128.000,2)) AS VARCHAR(10))+')' QUERY FROM dbo.SYSFILES a (NOLOCK) JOIN SYSFILEGROUPS b (NOLOCK) ON a.groupid = b.groupid ORDER BY b.groupname
PS。我認為重建表及其索引是不必要的,因為表被截斷了
我要問的第一件事是你確定你刪除的列是小數嗎?
我問的原因是使用可變列( Decimal 不是),那麼SQL Server 不會在這些被刪除時自動減少使用的空間。要解決此問題,您可以執行DBCC CLEANTABLE。無論如何,您可能想嘗試一下。
但是,如果您刪除的列只是小數,那麼這可能不會產生影響。
另一種可能性是小數列並沒有佔用太多空間 - 根據精度,小數列可能非常小。您說沒有明顯的區別,與表中的其他列(和數據庫的其餘部分)相比,十進制列佔用的空間相對較小嗎?
檢查更改前後實際表的已用空間。我用這個查詢來檢查使用的表間隔
SELECT t.NAME AS TableName, i.name AS indexName, SUM(p.rows) AS RowCounts, SUM(a.total_pages) AS TotalPages, SUM(a.used_pages) AS UsedPages, SUM(a.data_pages) AS DataPages, (SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB, (SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB, (SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id WHERE t.NAME NOT LIKE 'dt%' AND i.OBJECT_ID > 255 AND i.index_id <= 1 GROUP BY t.NAME, i.object_id, i.index_id, i.name ORDER BY OBJECT_NAME(i.object_id)
注意/警告: 我假設您在某種開發或測試環境中執行此操作,在沒有測試的情況下在生產中執行此類操作確實不可取。這篇較早的文章與您的相似(但特別是關於可變列長度)。
SpaceUsed 您查找已用空間的查詢看起來不錯,但是有一個內置儲存過程sp_spaceused,您可能會發現它更容易(但可能沒有太大區別。
您在評論中指出您刪除了精度為 33 的小數列。由於精度如此之大,您希望釋放大量空間。您還說該表使用頁面壓縮。關於為什麼在沒有列的情況下再次插入數據後沒有看到大量空間減少的原因,我可以想到一些解釋。
- 列值大多沒有填滿精度中可用的完整 33 位數字。頁面壓縮也實現了行壓縮。對於行壓縮:
它對數字類型(例如整數、小數和浮點數)和基於數字的類型(例如日期時間和貨幣)使用可變長度儲存格式。
這意味著每個值可能不會佔用與數據類型相關的全部17 個字節的儲存空間。
2)您有許多重複的列值。頁面壓縮可以減少該值和其他一些情況所需的儲存空間。
- 這些列的存在可能導致頁面中的數據以這樣一種方式分佈,即頁面壓縮可以更好地壓縮表中的其他列。我懷疑這不太可能。
4)根據您插入數據的方式,新數據可能比舊數據更加碎片化。此外,您正在檢查整個文件組的空間,因此在您的表釋放空間的同時,可能還有另一個表獲得了空間。我建議使用
sp_spaceused
來測量單個表的空間。