Concluimos una miniserie sobre cómo trabajar con agregados en PostgreSQL:
¿Por qué, cómo y vale la pena?
procesamiento eficiente del flujo de "hechos"
superaggregados multidimensionales
Y hoy hablaremos sobre cómo puede reducir la latencia total para insertar muchos cambios en tablas agregadas mediante el uso de tablas de ensayo y procesamiento externo.
Hablemos de esto usando el ejemplo del recopilador de nuestro servicio de análisis de registros PostgreSQL , del que ya hablé en artículos anteriores:
Escribimos en PostgreSQL en sublight: 1 host, 1 día, 1TB
Teletransportando toneladas de datos a PostgreSQL
Desde el punto de vista de seguir trabajando con la tabla de agregados, siempre es ventajoso tener una sola copia del registro en ella, y no intentar sobrescribirlo muchas veces, por lo que tenemos a nuestra disposición opciones de agregación intermedia en el memoria del proceso y un "balanceo" separado de cambios .
( "10 +1", "1 +10"), .
", !.."
, / ( ) . :
, .
, COPY
, "" + , INSERT ON CONFLICT ... DO UPDATE
. , - , UPDATE
! ""?..
RowExclusiveLock
xmax
WAL- heap
- , HOT update
- "" "" . UPDATE
, ...
-
, - , WAL-, UPDATE' - "" INSERT
... !
:
CREATE UNLOGGED TABLE px$agg(
LIKE agg
);
UNLOGGED
, "DBA: ".
- .
-
- - , - . , , - , .
-, " pull-".
10 - (, Seq Scan
, "" ), PostgreSQL , .
, , "SQL HowTo: 1000 ".
, , - TRUNCATE
:
BEGIN;
INSERT INTO agg
SELECT
pk1
...
, pkN
, <aggfunc>(val1) -- sum/min/max/...
, <aggfunc>(val2)
...
FROM
px$agg -- Seq Scan
GROUP BY -- PK = (pk1, ..., pkN)
pk1
...
, pkN;
TRUNCATE px$agg;
COMMIT;
, , , TRUNCATE
, - .
, -, - - . , .
, , LOCK
, , - .
... !
BEGIN;
SET LOCAL lock_timeout = '100ms'; -- 100
LOCK TABLE px$agg IN ACCESS EXCLUSIVE MODE; -- ,
ALTER TABLE px$agg RENAME TO px$agg_swap; --
ALTER TABLE px$agg_ RENAME TO px$agg;
ALTER TABLE px$agg_swap RENAME TO px$agg_;
COMMIT;
, . - , .
, RENAME
, - :
px -> px0, px1 -> px
px -> px1, px0 -> px
- :
10% , .