Agregados en la base de datos - tablas proxy

Concluimos una miniserie sobre cómo trabajar con agregados en PostgreSQL:





  • ¿Por qué, cómo y vale la pena?





  • procesamiento eficiente del flujo de "hechos"





  • superaggregados multidimensionales





Y hoy hablaremos sobre cómo puede reducir la latencia total para insertar muchos cambios en tablas agregadas mediante el uso de tablas de ensayo y procesamiento externo.





Hablemos de esto usando el ejemplo del recopilador de nuestro servicio de análisis de registros PostgreSQL , del que ya hablé en artículos anteriores:





Desde el punto de vista de seguir trabajando con la tabla de agregados, siempre es ventajoso  tener una sola copia del registro en ella, y no intentar sobrescribirlo muchas veces, por lo que tenemos a nuestra disposición opciones de  agregación intermedia en el memoria del  proceso y un  "balanceo" separado de cambios .





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