我有一个继承的数据库模式,其中所有整数列都被定义为,int
但由于业务规则,许多数据类型可以替换为tinyiny
需要较少存储的其他数据类型。虽然我不期望通过使用较小的类型来提高性能,但我想要这样做的原因是:
该应用程序使用 SQL Server Express,因此我想在需要清除数据之前充分利用 10GB 的数据库大小。
该应用程序附带数据库的完整初始副本,并且使用 Microsoft Sync Framework 同步更新。一些客户端 PC 的 Internet 连接速度相对较慢,因此数据库越小越好。
我想知道是否有某种方法可以快速识别可能“过大”的列?我意识到需要仔细检查结果,以确保该列永远不会超过新数据类型的限制。
以下存储过程将有助于识别这些列。它首先创建一个临时表,该表存储每个整数类型可以保存的最小值和最大值,然后运行动态查询以查找定义这些整数类型之一的每个表/列的最小值和最大值。一旦确定了最小/最大值,它就会查找可以保存当前值的最小类型并给出如下结果:
对于每一列,它显示表中找到的当前类型和最小/最大值,以及新的建议类型和它可以容纳的最小/最大值。根据基数,它还指示将节省的空间量的估计值。存储过程如下:
如果您可以升级到 SQL Server 2016 SP1 或更高版本,您可能会为自己节省大量工作。即使在从该服务包开始的 Express 版本中也可以使用数据压缩。您可以简单地将行压缩应用于所有表和索引,以节省比通过更改数据类型获得的空间更多的空间。那是因为您提到的数据类型仅使用通过行压缩来拟合实际值所需的字节。文档截图: