我们有一个将重新设计的SQL数据库。我们将把一些列类型从INT更改为TINYINT。通过这种转换,我们可以减少数据库的磁盘长度,或者这种转换不会大大减少磁盘空间?数据库版本是SQL Server 2008 R2 32位。
答案 0 :(得分:3)
我们将把一些列类型从INT更改为TINYINT。
注1(我的观点):真正的问题不是关于磁盘上的存储,而是关于缓冲池。
注意2:为列选择正确的数据类型(例如MyColumn
)会影响以下数据库结构的大小:
MyColumn
,如果聚集索引键的一部分,因为聚簇索引键在每个非聚簇索引行中重复,则在每个主要{{3}中重复(我不是100%肯定:并且在每个辅助xml“FOR PROPERTY”索引中)并且在每个xml index中都是重复的。MyColumn
是索引的一部分(作为键或覆盖列(SQL2005 +,请参阅CREATE ... INDEX ... ON ... INCLUDE()
),则非聚集索引大小。MyColumn
有{PRIMARY KEY约束| UNIQUE约束+ NOT NULL | UNIQUE索引+ NOT NULL}并且如果有外键引用MyColumn
那么这些FK必须具有相同的数据类型,最大长度,精度,比例和整理,如MyColumn
(PK / UQ)。当然,这些FK也可以被索引(聚簇/非聚簇索引)。MyColumn
。索引视图可以具有唯一的聚簇索引和非聚簇索引,因此MyColumn
可以再次复制。MyColumn
具有{一个PRIMARY KEY约束|一个UNIQUE约束+ NOT NULL |一个UNIQUE索引+ NOT NULL},那么它们在引用该列的每个spatial index中都会重复(参见CREATE FULLTEXT INDEX ... KEY unique_index_name
})。所以,是的,更改某些列的数据类型可能会产生很大的影响。您可以使用此脚本:
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;
找出在数据类型更改之前和之后每个{heap structure | index}有多少页。
注意3:如果您有Enterprise Edition
,那么您可以压缩数据(full-text index,link 1)。
答案 1 :(得分:1)
对于从INT更改为TINYINT的每列,它会将行大小减少3个字节。您可能需要手动回收空间。重建聚集索引将执行此操作。