在数据库中检索条目时,在SELECT语句中使用 ORDERBY 时,将值存储为浮点数还是小数与int之间是否存在差异?
答案 0 :(得分:7)
这取决于。您没有指定RDBMS,因此我只能专门与SQL Server通信,但数据类型具有与之关联的不同存储成本。 Ints范围为1到8个字节,Decimals为5-17,floats为4到8个字节。
RDBMS需要从磁盘读取数据页以查找数据(最坏情况),并且它们只能在8k页数据上放置这么多行。因此,如果你有17个字节的小数,那么你将获得每次读取磁盘读取行数的1/17,而不是正确调整数据大小并使用1英寸成本的tinyint来存储X.
当您对数据进行排序(排序)时,存储成本会产生级联效应。它将尝试在内存中进行排序,但如果你有大量的行并且缺乏内存,它可能会转储到临时存储器中进行排序,而你却一次又一次地支付这个成本。
索引可能有所帮助,因为数据可以按排序方式存储,但如果将数据存入内存可能对肥胖数据类型不那么有效。
[编辑]
@Bohemian对整数与浮点比较的CPU效率提出了一个很好的观点,但CPU在数据库服务器上加标的情况极为罕见。您更有可能受到磁盘IO子系统和内存的限制,这就是为什么我的答案集中在将数据引入引擎以执行排序操作与CPU比较成本之间的速度差异。
答案 1 :(得分:6)
(编辑)由于int和float在磁盘上占据完全相同的空间,当然在内存中 - 即32位 - 唯一的区别在于它们处理的方式
int
的排序速度应该比float
更快,因为比较更简单:处理器可以在一个机器周期中比较整数,但浮点数必须“解释”才能获得一个值比较(不确定有多少个周期,但可能不止一个,尽管有些CPU可能对浮点比较有特殊支持)。
答案 2 :(得分:3)
通常,数据类型的选择应该由数据类型是否适合存储需要存储的值来驱动。如果给定的数据类型不合适,那么它的效率并不重要。
就磁盘i / o而言,速度差是二阶的。在您的设计关于一阶效果之前,不要担心二阶效应。
当可以按排序顺序检索查询时,正确的索引设计将导致延迟大幅减少。但是,加快查询速度是以减慢其他进程(如修改索引数据的进程)为代价的。必须考虑权衡以确定它是否值得。
简而言之,担心在您担心将会增加10%的磁盘i / o之前会使磁盘i / o加倍或更糟的事情