Agregados no banco de dados - tabelas proxy

Concluímos uma minissérie sobre como trabalhar com agregados no PostgreSQL:





  • por que, como e vale a pena?





  • processamento eficiente do fluxo de "fatos"





  • superagregados multidimensionais





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:





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



, - :





  1. px -> px0, px1 -> px





  2. px -> px1, px0 -> px





"" PgQ Londiste.





- :





  10% , .








All Articles