2013-07-24 58 views
0

我們有一個SQL數據庫,將被重新設計。我們將把某些列類型從INT更改爲TINYINT。通過這種轉換,我們可以減少數據庫磁盤的長度,或者這種轉換不會顯着減少磁盤空間?數據庫版本是SQL Server 2008 R2 32位。SQL Server重新設計,以減少磁盤空間

+3

沒有SQL Server 2004.但是,最近唯一一個名稱中有'R2'的是2008 R2。 –

+0

它取決於行的現有大小 - 表中是否有任何可變長度的列?無論哪種方式,您必須計算每行的磁盤大小,然後計算建議更改行的磁盤大小,然後確定是否有更多的行適合每個頁面。 –

+0

您是否將重新設計時間的成本與購買/更換更多磁盤的成本進行比較?如果磁盤空間是唯一的上升空間(內存也可能是或者索引大小),那麼它是值得的。 –

回答

3

我們打算將某些列類型從INT更改爲TINYINT。

注1(我的觀點):真正的問題不是關於磁盤上的存儲,而是關於緩衝池。

注2:選擇某列的正確的數據類型(前MyColumn)影響以下數據庫結構的尺寸:

  1. 首先堆/聚簇索引的尺寸和然後
  2. {非聚集索引| xml索引|空間索引}大小如果MyColumn如果部分聚簇索引鍵,因爲聚簇索引鍵在每個非聚簇索引行中都被複制,則在每個主聚合中重複xml index(我不是100%確定的:在每一個輔助xml'FOR PROPERTY'索引)並在每個spatial index中進行復制。
  3. 非聚集索引的大小,如果MyColumn是索引的一部分(作爲密鑰或作爲覆蓋柱(SQL2005 +,見CREATE ... INDEX ... ON ... INCLUDE()
  4. 如果MyColumn具有{PRIMARY KEY約束|。UNIQUE約束+ NOT NULL | UNIQUE索引+ NOT NULL},如果存在引用MyColumn的外鍵,那麼這些FK必須具有相同的數據類型,如MyColumn(PK/UQ)的最大長度,精度,比例和歸類。當然,這些FK也可以被索引聚簇/非聚簇索引)
  5. 如果MyColumn包含在索引視圖中,則索引視圖可以具有唯一的聚簇索引和非聚簇索引,因此MyColumn可以再次複製
  6. 如果MyColumn具有{一個PRIMARY KEY約束|一個UNIQUE約束+ NOT NULL |一個UNIQUE索引+ NOT NULL},則它們在引用此列的每個full-text index(見CREATE FULLTEXT INDEX ... KEY unique_index_name)中都會被複制。
  7. 未涵蓋的主題:列存儲索引(SQL2012 +)。

所以,是的,更改某些列的數據類型可能會產生很大的影響。您可以使用以下腳本:

SELECT i.object_id, i.index_id, i.name, i.type_desc, ips.page_count, ips.* 
FROM sys.indexes i 
INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') AS ips ON i.object_id = ips.object_id AND i.index_id = ips.index_id 
WHERE i.name IN (
    N'PK_PurchaseOrderHeader_PurchaseOrderID', ... 
) 
ORDER BY i.object_id, i.index_id; 

瞭解在數據類型更改前後每個{堆結構|索引}有多少個頁面。注意3:如果你有Enterprise Edition那麼你可以壓縮數據(link 1,link 2)。

1

對於從INT更改爲TINYINT的每列,它會將行大小減少3個字節。不過,您可能需要手動回收空間。重建聚集索引將做到這一點。

+0

運行縮小命令不是必要的嗎? – miguelbgouveia

+1

@miguelbgouveia你可以在之後運行shrink命令來減小物理* .mdf文件的大小,但是這會影響你的索引,除非你的磁盤空間非常短,否則我建議不要這樣做。減少行大小的好處是可以將更多的行放入數據頁面,並且減少長度讀取所需的磁盤IO。 – Meff