Kami menyimpulkan seri mini tentang bekerja dengan agregat di PostgreSQL:
Dan hari ini kita akan berbicara tentang bagaimana Anda dapat mengurangi latensi total untuk memasukkan banyak perubahan ke dalam tabel agregat dengan menggunakan tabel pementasan dan pemrosesan eksternal.
Mari kita bicarakan hal ini menggunakan contoh kolektor layanan analisis log PostgreSQL kami , yang telah saya bicarakan di artikel sebelumnya:
Kami menulis di PostgreSQL di sublight: 1 host, 1 hari, 1TB
Menteleportasi banyak data ke PostgreSQL
Dari sudut pandang pekerjaan lebih lanjut dengan tabel agregat, selalu menguntungkan memiliki satu salinan catatan di dalamnya, dan tidak mencoba menimpanya berkali-kali, jadi kami memiliki opsi pembuangan untuk agregasi menengah di memori proses dan "rolling" perubahan yang terpisah .
( "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% , .