Concluímos uma minissérie sobre como trabalhar com agregados no PostgreSQL:
E hoje vamos falar sobre como você pode reduzir a latência total para inserir muitas alterações em tabelas agregadas usando tabelas de teste e processamento externo.
Vamos falar sobre isso usando o exemplo do coletor de nosso serviço de análise de log PostgreSQL , sobre o qual já falei em artigos anteriores:
Escrevemos em PostgreSQL no sublight: 1 host, 1 dia, 1 TB
Teleportando toneladas de dados para PostgreSQL
Do ponto de vista de trabalhos futuros com a tabela de agregados, é sempre vantajoso ter uma única cópia do registro nela, e não tentar sobrescrevê-la muitas vezes, portanto temos à nossa disposição opções de agregação intermediária no memória do processo e um "rolar" separado de mudanças .
( "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% , .