いくつかの集計を計算するために、PostgreSQLで多数の(いいえ、そうではありません... LARGE)レコードを処理する必要があるとします。では前の記事、私たちはこれを整理することができますどのようにするためのさまざまなオプションを分析し、この中の記事、私たちはどのように表示されます誰をブロックしないように、特にデータの「入力ストリーム」を含め、。
たとえば、残高を再計算して、一定の出荷で商品の連結売上を維持したり、会計勘定の残高と売上高を集計したり、トランザクションを大幅に変更したりすることができます...どの管理システムでもスライドがあります、VLSIも例外ではありません。
ただし、これらすべての状況には共通点があります。変更 の数は、ターゲットの集計の数よりもはるかに多くなります。例:数千の商品。それぞれが1日あたり数万の出荷を伴います。
さらに検討する際には、この「Amazonwithgoods」モデルに依存します。
目標-連結日次売上高
製品/日/数量のコンテキストで販売用の集計が必要です 。
具体的には、この場合、 さまざまなレポートで迅速かつ全体的に受け取ることができるように、「データベースに直接」集計を 作成します。
, , , - ClickHouse, . , , , , , , , ...
- ( ), 2PC- , - .
, - , , - , . , "" , .
?.. ...
, , "" - - , - - , "" , "" .
- "", - "--".
""
"". , - , .
"" . INSERT, UPDATE DELETE
, "" - INSERT
. , PostgreSQL , - unique-.
, " " , - . , - , "" flow-.
"" ""
flow- , / "" "- - ".
, , . , --, , .
, , , "" - … fail, :
DELETE FROM flow WHERE (it, dt) = (1, '2018-07-29') RETURNING *;
, - " ". , 1K/, 10K/.
:
SET statement_timeout = 1000;
, ! , , - flow- , . …
, "" , . " ", .
, flow , , "" .
DECLARE curs CURSOR FOR SELECT ctid, * FROM flow WHERE (it, dt) = (1, '2018-07-29') FOR UPDATE;
-- , ,
FETCH %d FROM curs;
DELETE FROM flow WHERE ctid = ANY(...);
flow ctid - "" .
SAVEPOINT
, "". %d FETCH? - , - ... ?
PostgreSQL " " SAVEPOINT/ROLLBACK TO, "" .
:
, ( - , ).
.
/ - COMMIT' .
, - COMMIT'.
, - , "" ( , ).
, !
BEGIN;
DECLARE curs CURSOR FOR SELECT ctid, * FROM flow WHERE (it, dt) = (1, '2018-07-29') FOR UPDATE;
FETCH 1 FROM curs;
DELETE FROM flow WHERE ctid = ANY(...);
-- processing
INSERT INTO agg ...
SAVEPOINT _1;
FETCH 2 FROM curs;
DELETE FROM flow WHERE ctid = ANY(...);
-- processing
INSERT INTO agg ...
SAVEPOINT _2;
FETCH 4 FROM curs;
DELETE FROM flow WHERE ctid = ANY(...);
-- processing...
INSERT INTO agg ...
-- oops! timeout exception!
ROLLBACK TO _2;
CLOSE curs;
COMMIT;
. , , !