Agrégats dans la base de données - tables proxy

Nous concluons une mini-série sur l'utilisation d'agrégats dans PostgreSQL:





  • pourquoi, comment et en vaut-il la peine?





  • traitement efficace du flux "faits"





  • superagrégats multidimensionnels





Et aujourd'hui, nous allons parler de la façon dont vous pouvez réduire la latence totale pour l'insertion de nombreuses modifications dans des tables agrégées à l'aide de tables intermédiaires et d'un traitement externe.





Parlons de cela à l'aide de l'exemple du collecteur de notre service d'analyse de journaux PostgreSQL , dont j'ai déjà parlé dans les articles précédents:





Du point de vue du travail ultérieur avec la table des agrégats, il est toujours avantageux d'  avoir une seule copie de l'enregistrement dedans, et de ne pas essayer de l'écraser plusieurs fois, nous avons donc à notre disposition des options d'  agrégation intermédiaire dans le mémoire du  processus et un  «roulement» séparé des changements .





( "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