2017-08-18 24 views
1

我想保存两位数字。存储数据的时间无关紧要。阅读至关重要。有很多行。数据类型vs约束在Datawarehouse中保存数字

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

  • 类型TINYINT
  • 有约束“< 100”
  • 一个数值型列类型TINYINT的列的列( 2,0)
  • char类型的列(2)
  • 类型炭的柱(2)用的约束 “[0-9] [0-9]”
  • 任何其他??

这是最高效的解决方案? (存储器,CPU)

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

+0

读取时是至关重要它主要依赖于所讨论的数据的形式是优选的阅读器。无论如何,检查约束不会影响阅读,应该添加到列中。 – Serg

+0

CCI使用压缩,所以是,索引类型的问题。请参阅数据库管理员的相关问题。 [做到位列文化创意产业提供任何性能优势?](https://dba.stackexchange.com/questions/183562/do-bit-columns-offer-any-performance-advantages-for-ccis) –

+0

对不起,只有ncci,因为我在SQL Server 2012上。 – Christian4145

回答

3

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

就CPU /速度而言,它很大程度上取决于你如何处理结果 - 比如加入,过滤或排序 - 以及sql-server优化器认为必须做的转换。

但是,实验上与Java JDBC 10百万个记录,显示,读出字符(2)需要1.5比读TINYINT,和读取数字(2,0)更多的时间花费读取TINYINT两倍的时间。

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

+0

你确定约束对阅读没有影响吗?我比较了一个900万记录表(> 20GB)上的计数,并确实看到(尽管很小)的差异。我会尽力重现结果。不应该在查询计划/优化器上有约束的影响吗? – Christian4145

+1

@ Christian4143,优化器可以使用检查约束来优化查询是否可信。我不能说你的具体测试,但与检查约束'(col1 <100)'和谓词'WHERE col1 = 100',我希望查询是一个完整的无操作。只需使用最适合存储数据域的数据类型,您通常就可以获得最佳性能。有一个检查约束的'tinyint'对100以下的正整数是最好的。 –

+0

好吧,我更正了:“约束对阅读没有影响”,改为“约束对阅读影响很小,除非在特殊情况下[WHERE col> 100] ”。 – AlainD

2

使用< 100" “有约束的类型TINYINT的列”。TINYINT使用1个字节存储在SQL。在更小的存储列上创建即使索引更快,因为更少的行符合相同的SQL页面上。

Index design guide

为了获得更好的性能,您的聚集索引应该是最优的,并且更好地与狭窄的指数。是的,数据也是很重要的大小,但良好的指标,并与有序列上使用SQL选择少列数在WHERE子句克服什么了。

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

相关问题