SUM、SUM_FLOAT 和 AVG 的数字数据类型溢出
使用具有 NUMERIC 数据类型的函数 SUM、SUM_FLOAT 和 AVG 时,请注意可能会发生溢出以及 Vertica 如何响应溢出。
此讨论适用于聚合函数和分析函数。
对于查询,当使用具有 NUMERIC 数据类型的函数 SUM、SUM_FLOAT 和 AVG 时,如果超出指定的精度,Vertica 允许静默溢出。
将 SUM 或 SUM_FLOAT 函数与 LAP 一起使用时,Vertica 也允许数字溢出。
默认溢出处理
对于 NUMERIC 数据类型,Vertica 在内部使用 18 位数的倍数。如果您指定的精度小于 18(例如,x(12,0)
),Vertica 允许溢出,最多包括 18 的第一个倍数。在某些情况下,如果对列 (SUM(x)
) 求和,则可能会超过 Vertica 内部为结果保留的位数。在这种情况下,Vertica 允许静默溢出。
关闭静默数字溢出
您可以关闭静默数字溢出,并指示 Vertica 隐式包含额外的数字位数。通过指定额外的空格,Vertica 可以一致地返回预期结果,即使超出 DDL 中指定的精度。
您可以通过将参数 AllowNumericOverflow 设置为 0 (false) 来关闭静默数字溢出。
当您将该参数设置为 0 时,Vertica 会考虑相应参数 NumericSumExtraPrecisionDigits 的值。
NumericSumExtraPrecisionDigits 参数默认为 6,这意味着 Vertica 在内部添加了超出 DDL 指定精度的六位。添加额外的精度位数可让 Vertica 一致地返回溢出 DDL 指定精度的结果。但是,在内部超出 18 的第二个倍数可能会对性能产生影响。
示例:
-
假设您的 DDL 指定 11(例如,
x(11,0)
),并且您接受默认值 NumericSumExtraPrecisionDigits (6)。在这种情况下,Vertica 在内部保持在 18 位数的第一个倍数内,不会产生额外的性能影响。 -
在相同的示例中,如果将 NumericSumExtraPrecisionDigits 设置为 10,Vertica 会在内部超出阈值,进入 18 的第二个倍数。在性能方面,如果(假设)第一个示例是性能“a”,则第二个示例是“2a”,这大大增加了性能影响。超过 18 的第二个倍数后,性能影响仍然是“2a”。
此示例表示法显示,当您将 AllowNumericOverflow
设置为 0 (false) 时 Vertica 如何在内部做出响应。
如果您希望超过 DDL 中指定的精度,Vertica 建议您关闭静默数字溢出,并设置参数 NumericSumExtraPrecisionDigits。进入 18 的第二个倍数会影响性能。因此,在将 NumericSumExtraPrecisionDigits 设置为高于返回数字列的 SUM 所需的数字之前,请多加考虑。
请注意,如果您关闭 AllowNumericOverflow,并且超出由 NumericSumExtraPrecisionDigits 设置的额外精度位数,Vertica 将返回错误。
对实时聚合投影 (LAP) 的影响
对于 LAP,如果您的 LAP 使用 SUM 或 SUM_FLOAT 函数,Vertica 还允许静默数字溢出。要关闭 LAP 的静默数字溢出:
-
将参数 AllowNumericOverflow 设置为 0。
-
将参数 NumericSumExtraPrecisionDigits 设置为所需的隐式位数数值。或者,使用默认设置 6。
-
删除并重新创建您的 LAP。
如果您关闭静默数字溢出,请注意以下溢出导致回退或错误消息的情况。在这些示例中,AllowNumericOverflow 设置为 0 (false),每个 LAP 使用 SUM 或 SUM_FLOAT 函数。
当数字溢出关闭时:
-
负载可以在溢出时回退。
Vertica 在加载到 LAP 之前聚合数据。如果您正在插入、复制或合并数据,并且在 Vertica 正在聚合数据的加载期间发生溢出,则 Vertica 会回退加载。
-
加载后可能会发生溢出,因为 Vertica 会对现有数据求和。
Vertica 对现有数据总和的计算与其在数据加载期间执行的计算是分开的。如果您的 LAP 使用 SUM 或 SUM_FLOAT 选择列并且发生溢出,Vertica 会生成错误消息。此响应的方式类似于 Vertica 使用 SUM 或 SUM_FLOAT 函数为查询生成错误的方式。
-
在合并期间可能会发生溢出。
如果 Vertica 在 Tuple Mover 操作期间计算最终总和时发生溢出,Vertica 会在合并期间记录一条消息。如果发生错误,Vertica 会将 LAP 标记为过期。Vertica 不再使用过期的 LAP 运行 Tuple Mover 操作。