Ao longo da vida do aplicativo, mais e mais dados se acumulam em seu banco de dados. Quer se trate de um desktop, SaaS ou mesmo móvel - não importa, no mundo moderno quase todo mundo mantém algo "em casa".
Se for algum tipo de utilitário local, não é assustador, sua própria existência para o usuário é bastante limitada. Mas se isso é algo como o nosso VLSI , que acumula e ajuda a analisar as operações ao longo de todo o período de existência de um negócio, então, à medida que cresce, não só o número de operações se torna mais, mas também o entendimento de quais relatórios resumidos ajuda na gestão operacional .
Hoje vamos falar sobre como fazer esses relatórios de forma rápida, quais são as formas de sua implementação e quais são os “rakes” ao longo do caminho.
Contagem dinâmica
- count(*)/sum/min/max/...
. , , .
, - .
EXPLAIN- count(*)
"" , "" - " ". - , - MVCC, PostgreSQL , .
, "" count() EXPLAIN
.
-
- , , () "" .
:
--
CREATE TABLE tbl(
id
integer
);
--
CREATE TABLE agg(
id
integer
PRIMARY KEY
, qty
integer
);
--
CREATE OR REPLACE FUNCTION agg() RETURNS trigger AS $$
BEGIN
UPDATE agg SET qty = qty + 1 WHERE id = NEW.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER agg AFTER INSERT ON tbl
FOR EACH ROW
EXECUTE PROCEDURE agg();
, .
vs MVCC
, - MVCC "" (dead tuples), , PostgreSQL . .
MVCC UPDATE "PostgreSQL Antipatterns: ".
, , PostgreSQL autovacuum'. , "":
ALTER TABLE agg SET (
autovacuum_vacuum_threshold = 100 -- 100
, autovacuum_vacuum_scale_factor = 0.01 -- 1%
);
, . , autovacuum_naptime
, :
ALTER SYSTEM SET autovacuum_naptime = '1min'; --
! /, autovacuum/autoanalyze .
- ? - "" "":
- , , - , .
, , "".
+ worker
- "" " ", Index Scan
, "" , "SQL HowTo: --".
- , "" , ( ) "" , , .
- "". , - worker'. pg_try_advisory_lock
.
, , - (/) .
(+2 " "), - .
- :
WITH del AS (
DELETE FROM
diff
RETURNING * -- CTE
)
INSERT INTO
agg
SELECT -- ID
id
, sum(qty)
, count(*)
FROM
del
GROUP BY
1
ON CONFLICT(id) --
DO UPDATE SET
(sum, count) = (agg.sum + EXCLUDED.sum, agg.count + EXCLUDED.count);
worker' diff-, ( , ) .
, -, - MVCC - , , "DBA: VACUUM — ".
-
( ) PostgreSQL - . , , .
, , - . , .
"" PostgreSQL.
. NOTIFY
/PgQ/RabbitMQ/Kafka/..., worker "", .
, PostgreSQL
PostgreSQL "" ACID. , : Redis, Tarantool, ClickHouse, ... - .
(Redis) (ClickHouse).
? !