Wir schließen eine Miniserie über die Arbeit mit Aggregaten in PostgreSQL ab:
Und heute werden wir darüber sprechen, wie Sie die Gesamtlatenz für das Einfügen vieler Änderungen in aggregierte Tabellen mithilfe von Staging-Tabellen und externer Verarbeitung reduzieren können.
Lassen Sie uns anhand des Beispiels des Sammlers unseres PostgreSQL-Protokollanalysedienstes darüber sprechen, über den ich bereits in früheren Artikeln gesprochen habe:
Wir schreiben in PostgreSQL auf Sublight: 1 Host, 1 Tag, 1 TB
Tonnenweise Daten nach PostgreSQL teleportieren
Unter dem Gesichtspunkt der weiteren Arbeit mit der Aggregattabelle ist es immer vorteilhaft, eine einzige Kopie des Datensatzes darin zu haben und nicht zu versuchen, ihn mehrmals zu überschreiben, so dass wir Optionen für die Zwischenaggregation in der Tabelle zur Verfügung haben Erinnerung an den Prozess und ein separates "Rollen" von Änderungen .
( "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% , .