【发布时间】:2011-11-13 17:16:50
【问题描述】:
在数据库中检索条目时,在 SELECT 语句中使用 ORDERBY 时,将值存储为浮点数或小数与 int 有区别吗?
【问题讨论】:
标签: performance database-design sql-order-by
在数据库中检索条目时,在 SELECT 语句中使用 ORDERBY 时,将值存储为浮点数或小数与 int 有区别吗?
【问题讨论】:
标签: performance database-design sql-order-by
这取决于。您没有指定 RDBMS,所以我只能专门与 SQL Server 交谈,但数据类型具有与之相关的不同存储成本。 Ints 的范围是 1 到 8 个字节,Decimals 是 5-17,floats 是 4 到 8 个字节。
RDBMS 将需要从磁盘读取数据页以查找您的数据(最坏的情况),并且它们只能在 8k 数据页上容纳这么多行。因此,如果您有 17 字节小数,那么每次读取从磁盘读取的行数将是您正确调整数据大小并使用具有 1 字节成本的 tinyint 存储 X 时的 1/17。
当您对数据进行排序(排序)时,该存储成本将产生级联效应。它会尝试在内存中排序,但如果你有无数行并且内存不足,它可能会转储到临时存储中进行排序,并且你一遍又一遍地支付这笔费用。
索引可能会有所帮助,因为数据可以按排序方式存储,但同样,如果将数据放入内存中对于肥胖的数据类型可能效率不高。
[编辑]
@Bohemian 对整数与浮点比较的 CPU 效率做了一个很好的说明,但在数据库服务器上 CPU 出现峰值的情况非常罕见。您更有可能受到磁盘 IO 子系统和内存的限制,这就是为什么我的答案侧重于将数据输入引擎以执行排序操作与比较 CPU 成本之间的速度差异。
【讨论】:
【讨论】:
一般来说,数据类型的选择应该由数据类型是否适合存储需要存储的值来决定。如果给定的数据类型不合适,那么它的效率就无关紧要。
就磁盘 i/o 而言,速度差异是二阶的。在您的设计就一阶效应而言良好之前,不要担心二阶效应。
当可以按排序顺序检索查询时,正确的索引设计将大大减少延迟。但是,加快查询的速度是以减慢其他进程为代价的,例如修改索引数据的进程。必须考虑权衡,看看是否值得。
简而言之,在担心会增加 10% 到磁盘 i/o 的东西之前,先担心会使磁盘 i/o 翻倍或更糟的东西
【讨论】: