sql-server - SQL Server:为最有效的大小创建表列
问题描述
我的 SQL Server 数据库是由一名自由开发人员创建和设计的。
我看到数据库变得非常大,我想确保列数据类型在保持尽可能小的大小方面是最有效的。
大多数列被创建为
VARCHAR (255), NULL
这涵盖了他们所在的地方
- 最大长度为 2 个数字的数字
- 长度永远不会超过 3 个数字或空白的数字
- 仅包含 1 个字母或空白的 Alpha
然后有许多列是字母数字的,最多 10 个字母数字字符,最多 25 个。
有一个大的字母数字列,最多可包含 300 个字符。
对一个列进行了修正,该列显示了以秒为单位的比赛时间。小于 1000 秒,最多保留 2 个小数位
这设置为DECIMAL (18,2) NULL
问题是我可以通过更改列数据类型来减小数据库的大小,还是原始设计最适合目的?
解决方案
您绝对应该努力为所有列使用最合适的数据类型 - 在这方面,自由开发人员做得非常糟糕 - 从一致性和可用性的角度来看(只需尝试总结VARCHAR(255)
列中的数字,或者按它们的数值排序 - 糟糕的设计......),但也从性能的角度来看。
- 最大长度为 2 个数字的数字
- 长度永远不会超过 3 个数字或空白的数字
-> 如果你不需要任何小数点(只有整数) - 使用INT
- 仅包含 1 个字母或空白的 Alpha
-> 在这种情况下,我会使用 a CHAR(1)
(或者NCHAR(1)
如果您需要能够处理 Unicode 字符,如希伯来语、阿拉伯语、西里尔语或东亚语言)。由于它实际上只有 1 个字符(或什么都没有),因此没有必要或没有必要使用可变长度字符串数据类型,因为每个存储的字符串只会增加至少 2 个字节的开销
- 有一个大的字母数字列,最多可包含 300 个字符。
-> 这是列的绝佳候选者VARCHAR(300)
(或者再次:NVARCHAR(300)
如果您需要支持 Unicode)。在这里,如果您真的想存储更少的字符,我肯定会使用可变长度的字符串类型来避免用空格填充列直到定义的长度。
推荐阅读
- python - 检查Django中是否存在文件
- multithreading - 为什么 Go 函数中的 go func 需要等待组才能正确退出?
- css - 如何在css上选择非后代
- c# - 当 PrincipalContext ContextType.Domain 指向虚假 IP 地址时
- python - 错误:发现样本数量不一致的输入变量:[49400, 1]
- flutter - 如何在不上传到 Snap Store 的情况下共享 Flutter Linux 桌面发布应用程序
- typescript - 如何获取和修改泛型类型中输入类型的名称
- sql - 如何在 Postgresql 中将尾随或前导零添加到“0.1201”或“01.00”总共 7 个数字
- anylogic - 不同时间占用的资源
- javascript - 为什么透明背景会导致绘制对象的痕迹?