Agregat dalam database - tabel proxy

Kami menyimpulkan seri mini tentang bekerja dengan agregat di PostgreSQL:





  • mengapa, bagaimana, dan apakah itu sepadan?





  • pemrosesan efisien dari aliran "fakta"





  • superagregat multidimensi





Dan hari ini kita akan berbicara tentang bagaimana Anda dapat mengurangi latensi total untuk memasukkan banyak perubahan ke dalam tabel agregat dengan menggunakan tabel pementasan dan pemrosesan eksternal.





Mari kita bicarakan hal ini menggunakan contoh kolektor layanan analisis log PostgreSQL kami , yang telah saya bicarakan di artikel sebelumnya:





Dari sudut pandang pekerjaan lebih lanjut dengan tabel agregat, selalu menguntungkan  memiliki satu salinan catatan di dalamnya, dan tidak mencoba menimpanya berkali-kali, jadi kami memiliki opsi pembuangan untuk  agregasi menengah di memori  proses dan  "rolling" perubahan yang terpisah .





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