Sql server SQL Server:创建表列以获得最有效的大小

Sql server SQL Server:创建表列以获得最有效的大小,sql-server,database-design,Sql Server,Database Design,我的SQL Server数据库是由一名自由职业开发人员创建和设计的 我看到数据库变得相当大,我希望确保列数据类型在保持尽可能小的大小方面是最有效的 大多数列创建为 VARCHAR (255), NULL 这包括他们所在的地方 长度最多为2个数字的数字 长度永远不会超过3个数字或空白的数字 Alpha仅包含一个字母或为空 然后有许多列是字母数字的,最多10列 最多25个字母数字字符 有一个大的字母数字列,最多可包含300个字符 有一个栏目的修正案显示了比赛时间,以秒为单位。1000秒以下,小

我的SQL Server数据库是由一名自由职业开发人员创建和设计的

我看到数据库变得相当大,我希望确保列数据类型在保持尽可能小的大小方面是最有效的

大多数列创建为

VARCHAR (255), NULL
这包括他们所在的地方

  • 长度最多为2个数字的数字
  • 长度永远不会超过3个数字或空白的数字
  • Alpha仅包含一个字母或为空
然后有许多列是字母数字的,最多10列 最多25个字母数字字符

有一个大的字母数字列,最多可包含300个字符

有一个栏目的修正案显示了比赛时间,以秒为单位。1000秒以下,小数点后最多2位

这被设置为
DECIMAL(18,2)NULL


问题是,我是否可以通过更改列数据类型来减小数据库的大小,或者原始设计是否达到了最佳目的?

您一定要努力为所有列使用最合适的数据类型,在这方面,那个自由职业开发人员做得很差——从一致性和可用性两个角度来看都是如此(试着把
VARCHAR(255)
列中的数字加起来,或者按它们的数值排序——糟糕透顶的设计……),但从性能的角度来看也是如此

  • 长度最多为2个数字的数字
  • 长度永远不会超过3个数字或空白的数字
->如果您不需要任何小数点(仅需要整数)-请使用
INT

  • Alpha仅包含一个字母或为空
->在本例中,我将使用
CHAR(1)
(或者
NCHAR(1)
,如果您需要能够处理Unicode字符,如希伯来语、阿拉伯语、西里尔语或东亚语言)。因为它实际上只有1个字符(或者没有),所以使用可变长度的字符串数据类型是没有必要的,也没有意义的,因为每个存储的字符串只会增加至少2个字节的开销

  • 有一个大的字母数字列,最多可包含300个字符

->这是
VARCHAR(300)
列(或者如果需要支持Unicode,
NVARCHAR(300)
)的一个很好的候选者)。在这里,如果您真的想存储更少的字符,我肯定会使用可变长度字符串类型,以避免在列中填充不超过定义长度的空格。

选择最适合数据域的数据类型,存储通常是最理想的。似乎十进制(6,2)是所用时间的正确选择,与十进制(18,2)相比,它将节省4个字节。好的,这对本专栏来说是有意义的。它是从原来的VARCHAR(255)更改而来的,因为它在使用该格式的数据时存在困难。非常感谢您的评论……克里斯耶,我应该提到适当的数据类型也有助于数据的可用性,例如不进行类型转换的比较运算符。这一点的答案正如我所怀疑的,我很感谢现在已经清楚了这一点。我将测试一些列上的更改,希望在缩小数据库时看到大小减小。Chris…@no9chris-出于好奇,您的数据库有多大,包括磁盘大小和这些表中的行数?切换到适当的数据类型无疑是一种方法(即使磁盘空间不是问题),但我不知道从
varchar(255)切换到varchar会节省多少磁盘空间
int
除非你有大量的数据。我在主数据库的一个副本上进行了列更改,该副本的大小只有127MB(活动数据库的5%)。在为这个数据库运行了一个SHRINK之后,我惊讶地看到它增长到157MB。奇怪的是,我再次将12列转换回VARCHAR。进行了收缩&这次的结果是总大小为178MB。这背后显然有一个很好的理由,但使数据库更节省空间的目标似乎没有实现。这只是最初的开销吗?