Sql server 多小数与少小数之和浮动

Sql server 多小数与少小数之和浮动,sql-server,tsql,Sql Server,Tsql,我有一个表,其中包含我公司客户的月度财务信息-大约每月30.000.000行,每行上有一个YearMonth ID int和一个Customer ID bigint,以及许多带有财务指标浮动的列。 我有一个关于Customer\u Id、YearMonth\u Id的聚集索引和一个关于YearMonth\u Id的非聚集索引 如果我试着在yearmonth_id上做一个求和,我觉得这个查询需要花费一些时间。 现在我意识到我的数据包含很多小数,例如,当我从源代码导入数据时,4.3299929237

我有一个表,其中包含我公司客户的月度财务信息-大约每月30.000.000行,每行上有一个YearMonth ID int和一个Customer ID bigint,以及许多带有财务指标浮动的列。 我有一个关于Customer\u Id、YearMonth\u Id的聚集索引和一个关于YearMonth\u Id的非聚集索引

如果我试着在yearmonth_id上做一个求和,我觉得这个查询需要花费一些时间。 现在我意识到我的数据包含很多小数,例如,当我从源代码导入数据时,4.32999292370605

因此,我的问题是:服务器计算小数点较少的总和(例如4.33)是否比计算4.32999292370605更快

如果我的所有数据仅包含例如2位小数,我是否可以期望性能提高?如果性能提高,是否足以感受到速度秒数增加的差异

我完全控制数据;我只是想知道是否值得我删除数据库中的所有财务数据,并开始从源代码中再次导入,去掉额外的小数点?服务器仅用于分析目的,因此额外的小数点不会为我们增加任何价值,因此如果它会提高服务器速度,那么它也可能会被删除-但如果它不会,我会麻烦删除所有内容并再次导入,因为这将需要很多小时


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

我不相信通过减少值中的小数位数,您会看到性能有多大的提高。

数据类型不太可能与性能相关,尽管如注释所示,货币值应该使用小数而不是浮动

考虑将要求和的列添加为YearMonth_Id索引中包含的列。避免表扫描或键查找

编辑

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

或者,您可以将聚集索引更改为YearMonth_Id,将非聚集索引更改为CustomerID和YearMonth_Id,而不包括列。CustomerID的查询将需要键查找,但所有客户的查询都将利用聚集索引。与大多数索引策略一样,通常也会涉及权衡


您也可以考虑非集群的CurrnSt店索引,如果您可以在限制中工作,例如在SQL 2012世界中只读,需要企业版,或者在SQL 2016 SP1之前也分区EE。这对于大扫描来说是最有效的。

不是真正的答案,但是如果你说金融数据,请考虑把它存储在数据库中的小数点,浮动可能会导致你做噩梦。相关:使用超过2位小数的财务指标对我来说似乎有点奇怪。在美国,大多数金融交易仅限于销售2位小数的天然气,例如使用2位以上的天然气,但销售本身仅使用2位小数,尽管使用更多的天然气定价。在金融交易中使用浮动通常是不明智的。最好使用精度和刻度固定的十进制。关于这个问题:你们有关于年月ID的索引吗?没有客户ID?如果不是的话,分组可能会让你慢下来。如果你对超过2位小数不感兴趣,你可以使用数据类型money或smallmoney来代替float。你看过你的执行计划了吗?因为float是以2为基数的,所以我认为以10为基数的位数基本上与任何事情都无关。这不仅仅是交易,还有内部计算等等,我想这就是为什么我们在某些列上有很多小数点的原因。在我的单位,我们不关心精度,因为一切都是高水平的,所以我更关心速度,因为我们将在顶部使用BI工具。十进制数据类型的速度将大于浮点;即使这样,它也可能会占用服务器上更多的空间?我有大约40个财务专栏-我想添加所有这些专栏不是一个好主意?有多少列可以安全地添加到包含的部分?我想大部分情况下都是相同的,比如说我将使用10列。我把它们放在所包括的文件中的顺序会有什么不同吗?有时我想要收入,有时我想要支出,有时两者都想要——在每种情况下会使用同一个索引吗?@SteffenSylvestNielsen,在索引键列中排序,但不按包含列的顺序排序;只要列是键的一部分或包含在内,索引就会覆盖查询。好的-我会尝试将我的财务列添加到索引中,然后:-好的-chaing数据类型如何?不,更改数据类型不会显著影响性能,尽管正如其他人指出的,这将提高准确性。提高性能的最佳方法是查看执行计划并更改索引以避免Sc Dan建议的ans和密钥查找。