问题描述
我的SQL Server数据库是由自由开发人员创建和设计的。
我看到数据库越来越大,我想确保列数据类型在保持尽可能小的大小方面最有效。
大多数列创建为
VARCHAR (255),NULL
这涵盖了他们所在的地方
- 最多2个数字的数字
- 长度不能超过3个数字或空白的数字
- 仅包含1个字母或为空白的字母
然后有许多字母数字的列,最多10个 最多25个字母数字字符。
有一列大的字母数字列,最多可包含300个字符。
对某列进行了修改,该列显示了参加比赛的时间(以秒为单位)。在1000秒以内,最多2个小数位
此设置为DECIMAL (18,2) NULL
问题是我是否可以通过更改列数据类型来减小数据库的大小,或者原始设计是否最适合目的?
解决方法
对于所有列,您绝对应该努力使用最合适数据类型-在这方面,从一致性的角度来看,自由开发者的工作做得很差 strong>和可用性(只需尝试对VARCHAR(255)
列中的数字求和,或按其数值排序-糟糕的设计...),而且从性能角度考虑视图。
- 最大为2个数字的数字
- 长度不能超过3个数字或空白的数字
->如果不需要任何小数小数点(仅整数)-请使用INT
- 仅包含1个字母或为空的字母
->在这种情况下,我将使用CHAR(1)
(或NCHAR(1)
,如果您需要能够处理Unicode字符,例如希伯来语,阿拉伯语,西里尔字母或东亚语言)。由于它实际上只有1个字符(或什么也没有),因此不需要使用可变长度字符串数据类型,因为每个字符串存储至少增加2个字节的开销
- 有一个很大的字母数字列,最多可以包含300个字符。
->这是VARCHAR(300)
列的最佳选择(或者,如果需要支持Unicode,则再次为NVARCHAR(300)
)。在这里,如果您确实想存储较少的字符,我肯定会使用 variable-length 字符串类型,以避免在列中填充不超过定义长度的空格。