Nous concluons une mini-série sur l'utilisation d'agrégats dans PostgreSQL:
pourquoi, comment et en vaut-il la peine?
traitement efficace du flux "faits"
superagrégats multidimensionnels
Et aujourd'hui, nous allons parler de la façon dont vous pouvez réduire la latence totale pour l'insertion de nombreuses modifications dans des tables agrégées à l'aide de tables intermédiaires et d'un traitement externe.
Parlons de cela à l'aide de l'exemple du collecteur de notre service d'analyse de journaux PostgreSQL , dont j'ai déjà parlé dans les articles précédents:
Nous écrivons en PostgreSQL sur sublight: 1 hôte, 1 jour, 1 To
Téléporter des tonnes de données vers PostgreSQL
Du point de vue du travail ultérieur avec la table des agrégats, il est toujours avantageux d' avoir une seule copie de l'enregistrement dedans, et de ne pas essayer de l'écraser plusieurs fois, nous avons donc à notre disposition des options d' agrégation intermédiaire dans le mémoire du processus et un «roulement» séparé des changements .
( "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% , .