为 SQL Server 中的数字列选择最佳数据类型
Posted
技术标签:
【中文标题】为 SQL Server 中的数字列选择最佳数据类型【英文标题】:Choosing best datatype for numeric column in SQL Server 【发布时间】:2021-05-12 19:17:22 【问题描述】:我在 SQL Server 中有一个包含大量数据的表 - 大约 4000 万行。基本结构是这样的:
Title | type | length | Null distribution |
---|---|---|---|
Customer-Id | number | 8 | 60% |
Card-Serial | number | 5 | 70% |
- | - | - | - |
- | - | - | - |
Note | string-unicode | 2000 | 40% |
两个数字列都由具有特定长度的数字填充。
我不知道要选择哪种数据类型来使数据库具有最小的大小并通过索引customerId
列来获得良好的性能。如果我选择CHAR(8)
,请参考此Post,即使在空数据中,数据库也会每行消耗8个字节。
我决定使用INT
来减小数据库大小并拥有良好的索引,但空数据将再次使用每行 4 个字节。如果我想减小这个大小,我可以使用VARCHAR(8)
,但我不知道,系统在这个类型上设置索引是否有很好的性能。主要问题是减少数据库大小很重要或对数字类型有良好的索引。
谢谢。
【问题讨论】:
正如 marc 下面所说,最重要的是选择正确的数据类型。 从不,永远将数字存储在varchar
列中。每次你这样做时,一只小猫就会死去(并且永远不要使用 char
开头)。
看看稀疏列和页面压缩@a_horse_with_no_name 正确的re号,但长度固定时应该使用char
@Charlieface 如果数字的固定长度为 8,则最好使用 INT
。
@MohammadHajiHosseini 显然,如果它们是数字,您应该永远将它们存储为char
,就像 a_horse_with_no_name 所说的那样。但是如果你有一个固定长度的字母字符串(即它必须是一定的长度),那么一定要使用char
,只有在长度可变时才使用varchar
。
【参考方案1】:
如果它是一个数字 - 那么无论如何选择一个numeric数据类型!!不要将您的号码存储为char(n)
或varchar(n)
!这只会让你日后感到无比悲伤和头痛。
选择很明确:
如果您有整数个数字 - 使用 TINYINT
、SMALLINT
、INT
或 BIGINT
- 取决于您需要的数字范围
如果您需要 小数 - 使用 DECIMAL(p,s)
以获得最佳和最稳健的行为(没有像 FLOAT
或 REAL
这样的舍入错误)
选择最合适的数据类型比任何存储的微优化都重要得多。即使有 4000 万行 - 这仍然不是一个大问题,无论您使用 4 字节还是 8 字节。无论您使用 数字 类型还是字符串类型 - 这都会在数据库的可用性和处理方面产生巨大的差异!
【讨论】:
marc 是完全正确的,如果您的列有大量空值,您可以考虑将它们创建为 SPARSE 列。 假设我在指定条件的数据库中有大约八列。同样,您建议使用相同的数字类型。 @MohammadHajiHosseini 始终使用 正确 类型...否则您将在应用程序的生命周期内处理技术债务。该网站上的很大一部分问题来自试图处理他们错误存储数据这一事实的人。 但要非常小心,确保您处理的是数字而不是“数字”。例如。电话号码是一个“数字”,不应该存储在数字类型中,因为前导零、非数字字符可能很重要,而且你不要对它们进行数学运算。跨度>以上是关于为 SQL Server 中的数字列选择最佳数据类型的主要内容,如果未能解决你的问题,请参考以下文章
在SQL Server中实现Polymorphic Association的最佳方法是什么?
以在 Oracle 和 SQL Server 中获得最佳性能为目标的数据建模