SQL Server重新设计以减少磁盘空间

时间:2013-07-24 10:42:30

标签: sql-server database

我们有一个将重新设计的SQL数据库。我们将把一些列类型从INT更改为TINYINT。通过这种转换,我们可以减少数据库的磁盘长度,或者这种转换不会大大减少磁盘空间?数据库版本是SQL Server 2008 R2 32位。

2 个答案:

答案 0 :(得分:3)

  

我们将把一些列类型从INT更改为TINYINT。

注1(我的观点):真正的问题不是关于磁盘上的存储,而是关于缓冲池。

注意2:为列选择正确的数据类型(例如MyColumn)会影响以下数据库结构的大小:

  1. 首先堆/聚集索引大小和然后
  2. {非聚集索引| xml索引|空间索引}大小,如果MyColumn,如果聚集索引键的一部分,因为聚簇索引键在每个非聚簇索引行中重复,则在每个主要{{3}中重复(我不是100%肯定:并且在每个辅助xml“FOR PROPERTY”索引中)并且在每个xml 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},那么它们在引用该列的每个spatial index中都会重复(参见CREATE FULLTEXT INDEX ... KEY unique_index_name })。
  7. 主题非覆盖:列存储索引(SQL2012 +)。
  8. 所以,是的,更改某些列的数据类型可能会产生很大的影响。您可以使用此脚本:

    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 indexlink 1)。

答案 1 :(得分:1)

对于从INT更改为TINYINT的每列,它会将行大小减少3个字节。您可能需要手动回收空间。重建聚集索引将执行此操作。