Ami*_*aei 3 sql-server-2008 query aggregate
为什么我的查询是不确定的?
我有执行以下操作的查询:
select sum(float1*float2*coalesce(float3,1)) from table
Run Code Online (Sandbox Code Playgroud)
当我运行这个查询时,我得到了一个确定性的结果,但是当查询运行很多次时,情况似乎并非如此。
结果中的最后一个整数因不同的运行而异。
所有列都是 (float,null)
所有运行的浮动截断都应该相同吗?
乘以近似值会乘以错误:有时它们会抵消但通常它们会夸大
浮动也精确到15个显著数字 最多:当你乘和SUM可以快速打这个而失去精度。
我想结果的变化将取决于访问数据的顺序(例如新行、行溢出、页面拆分等的变化),因此所涉及的一系列计算将改变顺序,每个都有自己的四舍五入。
编辑:有一个想法。
每个核心/插槽将以不同的方式进行浮点计算。
试试这些,看看我们是否可以使这个确定性(注意这与“正确”不同)
将 MAXDOP 1 添加到查询中,看看你得到了多少不同的结果。我期待的不会超过内核或插槽的数量。这减少了具有并行性的排列数量
然后尝试处理器关联以始终对所有查询使用相同的核心,以强制查询在一个核心/cpu 上运行
要修复它,请使用 decimal 或 bigint。
归档时间: |
|
查看次数: |
621 次 |
最近记录: |