FIXNUMERIC es un tipo de datos decimal de precisión fija para AnalyticDB for PostgreSQL que almacena valores decimales como enteros nativos (INT64 o INT128) con una escala predefinida. Al mapear los decimales a enteros, FIXNUMERIC evita la sobrecarga de la aritmética de precisión variable y la pérdida de precisión causada por errores de representación binaria en cálculos de punto flotante. En cargas de trabajo intensivas en cómputo, como agregaciones a gran escala y cálculos financieros, FIXNUMERIC supera significativamente en rendimiento a los tipos nativos NUMERIC y DECIMAL.
Cuándo usar FIXNUMERIC
Utilice FIXNUMERIC cuando su carga de trabajo requiera todos los siguientes elementos:
Valores decimales exactos: cálculos financieros, libros contables, facturación o informes de cumplimiento donde los errores de redondeo son inaceptables.
Alto rendimiento de consultas: agregaciones a gran escala con
SUM,AVGu otras funciones sobre columnas numéricas.Rangos de datos predecibles: valores que se ajustan al rango de enteros de 64 bits o 128 bits.
Mantenga el tipo NUMERIC si necesita:
Compatibilidad con NaN:
FIXNUMERICno admite valores NaN.Rango ilimitado: valores que exceden los límites fijos de enteros de 64 bits o 128 bits.
Escala variable: columnas donde el número de lugares decimales difiere entre filas.
Funcionamiento de FIXNUMERIC
FIXNUMERIC mapea cada valor decimal a un entero mediante la multiplicación por una potencia de 10 igual a la escala predefinida; posteriormente, almacena el resultado en un registro de enteros nativo. Por ejemplo, 3.141592 con escala 6 se almacena como el entero 3141592. Las operaciones aritméticas se ejecutan directamente sobre estos enteros mediante conjuntos de instrucciones nativas de la CPU. Por esta razón, las consultas de agregación sobre columnas FIXNUMERIC son sustancialmente más rápidas que las consultas equivalentes sobre columnas NUMERIC.
FIXNUMERIC tiene dos variantes. Elija la adecuada según la precisión y el rango que requieran sus datos:
|
Variante |
Almacenamiento |
Precisión |
Tipo equivalente |
Recomendado para |
|
|
Entero de 64 bits ( |
Hasta 19 dígitos, 6 lugares decimales |
|
Cálculos a pequeña y mediana escala |
|
|
Entero de 128 bits ( |
Hasta 38 dígitos, 10 lugares decimales |
|
Análisis de alto rango y alta precisión |
Se recomienda preferirFIXNUMERICen lugar deFIXNUMERIC128, a menos que sus valores requieran más de 19 dígitos significativos o más de 6 lugares decimales.
Comparación con NUMERIC
|
Función |
** |
** |
|
Precisión |
Fija (6 o 10 lugares decimales de forma predeterminada) |
Variable |
|
Rango |
Limitado (basado en enteros de 64 bits o 128 bits) |
Casi ilimitado |
|
Rendimiento |
Alto (mediante operaciones basadas en conjuntos de instrucciones nativas de la CPU) |
Bajo |
|
Método de redondeo |
Redondeo hacia cero |
Redondeo al más cercano |
|
Compatibilidad con NaN |
No compatible |
Compatible |
Conversión de tipos en operaciones aritméticas
Algunas funciones convierten los valores FIXNUMERIC a DOUBLE antes de calcular un resultado. Esto aplica a round, sqrt, exp, ln, pow, power, log y log10. El resultado de estas funciones es un valor de punto flotante, no un FIXNUMERIC. Para operaciones que deben devolver resultados decimales exactos, utilice trunc, abs, ceil, floor o los operadores aritméticos estándar.
Limitaciones
Solo las instancias de AnalyticDB for PostgreSQL V7.0 que ejecutan la versión V7.2.1.1 o posterior son compatibles con la extensión fixnumeric. Para comprobar su versión menor, consulte View the minor version of an instance. Para actualizar, consulte UpgradeDBVersion.
Las instancias en modo Serverless no admiten la extensión fixnumeric.
FIXNUMERICyFIXNUMERIC128tienen rangos de valores fijos. Insertar un valor que exceda el rango provoca un error de desbordamiento.La escala es fija a nivel de tipo, no a nivel de columna. No se especifica la escala al crear una columna; la escala está predefinida en
6paraFIXNUMERICy en10paraFIXNUMERIC128.
Instalación de la extensión
La extensión fixnumeric no admite instalación mediante interfaz gráfica. Para instalarla, submit a ticket. Después de la instalación, reinicie su instancia de AnalyticDB for PostgreSQL. Para desinstalar la extensión, envíe un ticket.
Uso de FIXNUMERIC en consultas
FIXNUMERIC funciona como cualquier otro tipo de datos numérico y puede reemplazar columnas FLOAT o DOUBLE PRECISION que requieren valores exactos.
Paso 1: Crear una tabla e insertar datos
Cree una tabla con columnas FIXNUMERIC y FIXNUMERIC128 junto con columnas FLOAT y NUMERIC para comparar su comportamiento:
CREATE TABLE test_t(a float, b numeric(14,6), c fixnumeric, d fixnumeric128);
INSERT INTO test_t SELECT v+0.1,v+0.1,v+0.1,v+0.1 FROM generate_series(1,1000) v;
Paso 2: Crear índices
FIXNUMERIC admite índices. Cree índices en las columnas FIXNUMERIC:
CREATE INDEX ON test_t (c);
CREATE INDEX ON test_t (d);
Paso 3: Ejecutar consultas de agregación
Consulte la suma (SUM) de cada columna. La columna FLOAT devuelve un valor aproximado debido a errores de representación binaria, mientras que NUMERIC, FIXNUMERIC y FIXNUMERIC128 devuelven valores exactos:
SELECT SUM(a), SUM(b), SUM(c), SUM(d) FROM test_t;
sum | sum | sum | sum
--------------------+---------------+-------------------+-------------------
500600.00000000175 | 500600.000000 | 500600.0000000000 | 500600.0000000000
(1 row)
Consulte el promedio (AVG) de cada columna. Se observa la misma diferencia de precisión:
SELECT AVG(a), AVG(b), AVG(c), AVG(d) FROM test_t;
avg | avg | avg | avg
-------------------+----------------------+------------+----------------
500.6000000000017 | 500.6000000000000000 | 500.600000 | 500.6000000000
(1 row)
Funciones compatibles
FIXNUMERIC es compatible con la mayoría de las funciones que admiten tipos NUMERIC o DECIMAL, incluidas todas las funciones de agregación. Las funciones que devuelven un resultado de punto flotante están marcadas con un asterisco.
|
Función |
Descripción |
|
|
Calcula la suma, el promedio, el valor mínimo o el valor máximo |
|
|
Comprueba si un valor cae dentro de un rango |
|
|
Devuelve un valor absoluto |
|
|
Devuelve el signo de un valor: |
|
|
Trunca un número a una cantidad específica de lugares decimales |
|
|
Redondea hacia arriba al entero más cercano |
|
|
Alias de |
|
|
Redondea hacia abajo al entero más cercano |
|
|
Devuelve el resto de una división |
|
|
Devuelve el número de lugares decimales |
|
|
Suma, resta, multiplicación y división |
|
|
Operadores de comparación |
|
|
Redondea al entero más cercano; devuelve |
|
|
Devuelve la raíz cuadrada; devuelve |
|
|
Devuelve el exponente natural; devuelve |
|
|
Devuelve el logaritmo natural; devuelve |
|
|
Eleva a una potencia; devuelve |
|
|
Alias de |
|
|
Operación logarítmica; devuelve |
|
|
Logaritmo base 10; devuelve |
|
|
Convierte a cadena; |
*Estas funciones convierten FIXNUMERIC a DOUBLE antes de realizar el cálculo. El resultado es un valor de punto flotante.