Sum float with many decimals vs little decimals

时间:2017-08-03 13:04:12

标签: sql-server tsql

我有一个表格,其中包含我公司客户的每月财务信息 - 每月大约30.000.000行,每行有一个YearMonth ID(int)和一个Customer ID(bigint)以及很多列财务指标(浮动)。 我在(Customer_Id,YearMonth_ID)上有一个聚簇索引,在YearMonth_Id上有一个非聚集索引。

如果我试图在yearmonth_id之间做一笔总和,我觉得你的查询花了很长时间。 现在我意识到我的数据包含很多小数,例如我从我的来源导入数据时{​​{1}}。

因此我的问题是:服务器计算具有较少小数的总和是否更快,例如4.32999992370605而不是4.33

如果我的所有数据仅包含例如: 2位小数?如果性能提高,是否真的感觉到速度的差异(秒增加?)

我完全控制了数据;我只是想知道是否值得我擦除数据库中的所有财务并从源头再次开始导入它,切掉额外的小数点?服务器仅用于分析目的,因此额外的小数点不会为我们添加任何值,因此它可能会被切除,如果它会提高服务器的速度 - 但如果它不会我打扰删除所有内容并导入再次(因为那需要几个小时)。

编辑:我正在运行SQL Server 2014。

2 个答案:

答案 0 :(得分:3)

数据类型不太可能与性能相关,尽管应该使用十进制而不是浮点数作为货币值,如注释中所示。

考虑将要汇总的列添加为YearMonth_Id索引中的包含列。避免表扫描或密钥查找。

修改

在非聚集的YearMonth_Id索引中包含所有40列会增加存储空间,但允许在给定月份内所有客户的查询仅扫描该月的数据。

或者,您可以将聚簇索引更改为YearMonth_Id,将非聚簇索引更改为CustomerID和YearMonth_Id(不包括列)。 CustomerID的查询需要密钥查找,但所有客户的查询都将利用聚簇索引。与大多数索引策略一样,通常需要权衡利弊。

如果您可以在限制范围内工作(例如,在SQL 2012世界中只读它,并且需要Enterprise Edition),也可以使用分区(在SQL 2016 SP1之前也是EE),您也可以考虑非群集列存储索引。为大扫描执行最佳操作。

答案 1 :(得分:2)

我不相信您会通过减少值中的小数位来看到性能提升。