用于在Datawarehouse中保存数字的数据类型与约束

时间:2017-08-18 07:23:26

标签: sql sql-server tsql

我想保存两位数字。存储数据的时间无关紧要。阅读至关重要。有很多行。

我可以用不同的方式做到这一点:

  • tinyint
  • 类型的列
  • 具有约束&#34的类型为tinyint的列;< 100"
  • 数字(2,0)
  • 类型的列
  • char(2)
  • 类型的列
  • char(2)类型的列,带有约束" [0-9] [0-9]"
  • 任何其他??

哪种解决方案效果最好? (内存,CPU)

答案是否取决于列上索引的索引/类型? 答案是否取决于该列中存储的行数?

2 个答案:

答案 0 :(得分:3)

就存储而言,tinyint每个条目使用1个字节,numeric(2,0)每个条目使用5个字节,char(2)使用2个字节。约束对存储没有影响。

就CPU /速度而言,它几乎取决于你对结果所做的事情 - 比如连接,过滤或排序 - 以及sql-server优化器认为它必须做的转换。 / p>

然而,使用java JDBC对10百万条记录进行实验表明,读取char(2)比读取tinyint需要多1.5倍的时间,读取数字(2,0)需要两倍于读取tinyint的时间。

约束对写作有明显的影响,但对阅读的影响很小,除非像@DanGuzman [WHERE col = 100]或@ Christian4143 [Hudge Volume]提到的非常特殊的情况。

答案 1 :(得分:2)

使用"类型为tinyint的列,其约束为"< 100&#34 ;. Tinyint在sql中使用1个字节的存储空间。即使在较小的存储列上创建的索引也更快,因为相同的sql页面上的行数更少。

Index design guide

为了获得更好的性能,您的聚簇索引应该是最佳的,并且使用窄索引更好。是的,数据的大小也很重要,但是良好的索引和在sql中选择较少的列数,在WHERE子句中有序使用列可以克服其中的大部分。

https://www.red-gate.com/simple-talk/sql/performance/index-selection-and-the-query-optimizer