我有大量的MariaDB 10.6表,其中有几个decimal(P,D)
列和数百万行。这些列的精度(P
)和比例(D
)曾经被设置为不切实际的高水平,仅适应每种可能的输入,例如。decimal(24,10)
。
现在我想根据这些表中的实际数据确定所需的P
和D
值。
我能想到的最好的办法就是
SELECT CEIL(LOG10(MAX(col))) AS maxI,
MAX(CEIL(LOG10(CAST(REVERSE(SUBSTR(CAST(col % 1 AS VARCHAR(12)), 3)) AS INT)))) AS maxD
FROM tbl;
其中col
是数据类型为decimal(24,10)
的列,maxI
是最大整数部分,maxP
是小数点后的最大有效位数(因此maxP = maxI + maxD
)。
虽然它确实有效,但它的速度并不令人惊讶,我想知道是否有更有效的方法到达那里。
1条答案
按热度按时间oymdgrw71#
在处理精度数字时不要使用双精度函数(如LOG10),以避免警告和舍入错误。
计算小数点前的最大位数非常简单,因为这可以由优化器处理,而不涉及索引。对于无符号小数,你可以使用
MAX()
,对于有符号小数,你必须使用MIN()
和MAX()
:最多的十进制数有记录
MAX(col1 - TRUNCATE(col1,0))
。所以第二个陈述是:速度比较(700万行):
vs.