データベース内の集計-プロキシテーブル

PostgreSQLでのアグリゲートの操作に関するミニシリーズを締めくくります。





そして今日はステージングテーブルと外部処理を使用して、集約テーブルに多くの変更を挿入するための合計レイテンシを削減する方法について説明します





これについては、以前の記事ですでに説明したPostgreSQLログ分析サービスのコレクターの例を使用して説明しましょう





アグリゲートのテーブルをさらに操作するという観点からは、レコードのコピーを1つだけ保持し、何度も上書きしようとしないことが常に有利 であるため、中間アグリゲーションのオプションを自由に使用できます。  プロセスの メモリと変更の個別の「ローリング」





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