Aggregate in der Datenbank - effiziente Verarbeitung des Flusses von "Fakten"

Angenommen, Sie müssen eine große (nein, nicht diese ... GROSSE) Anzahl von Datensätzen in PostgreSQL verarbeiten, um einige Aggregate zu berechnen. Im vorherigen Artikel haben wir verschiedene Optionen analysiert, wie dies organisiert werden kann, und in diesem Artikel werden wir sehen, wie niemand besonders blockiert werden kann , einschließlich des "eingehenden Datenstroms".





Zum Beispiel kann es sein, Salden neu zu berechnen und konsolidierte Verkäufe für Waren mit ihren konstanten Lieferungen aufrechtzuerhalten oder Salden und Umsätze für Buchhaltungskonten mit massiven Änderungen bei Transaktionen oder etwas anderem zu aggregieren ... In jedem Managementsystem wird es eine Folie geben und VLSI ist auch keine Ausnahme.





Alle diese Situationen haben jedoch einen gemeinsamen Punkt: Die Anzahl der Änderungen ist  viel  größer als die Anzahl der Zielaggregate. Zum Beispiel: Tausende von Waren mit jeweils Zehntausenden von Sendungen pro Tag.





In weiteren Überlegungen werden wir uns auf dieses Modell von "Amazon mit Waren" verlassen.





Ziel - konsolidierter Tagesumsatz

Wir möchten Aggregate für den Verkauf im Kontext von  Produkt / Tag / Menge haben .





Insbesondere werden wir in diesem Fall Aggregate "direkt in der Datenbank" erstellen,   um sie schnell und ganzheitlich für verschiedene Berichte empfangen zu können.





, , , - ClickHouse, . , , , , , , , ...





- ( ), 2PC- , - .





, -   ,  , - , . ,  "" ,   .





?.. ...





    , ,  "" - - , - - ,   "" ,   ""  .





  - "", - "--".





"" , ,    ().





""

"". , - , .





  ""  .  INSERT, UPDATE DELETE



, "" -  INSERT



. , PostgreSQL  , - unique-.





, " " ,   - . , - , "" flow-.





"" ""

flow- ,   / ""  "- - ".





""? " , " -   58    .





,   , . , --, ,   .





, , , "" - …   fail, :





DELETE FROM flow WHERE (it, dt) = (1, '2018-07-29') RETURNING *;
      
      



, - " ". , 1K/, 10K/.





:





SET statement_timeout = 1000;
      
      



, ! , , - flow- ,   . …





, "" , . " ", .





, flow , ,   "" .





, , ! ,   :





DECLARE curs CURSOR FOR SELECT ctid, * FROM flow WHERE (it, dt) = (1, '2018-07-29') FOR UPDATE;
--  , ,    
    FETCH %d FROM curs;
    DELETE FROM flow WHERE ctid = ANY(...);
      
      



flow  ctid - ""   .





SAVEPOINT

, "". %d FETCH? - , - ... ?





PostgreSQL " "  SAVEPOINT/ROLLBACK TO, "" .





:





  1.  ( - , ).





  2. .





  3. -   COMMIT' .





  4.   , - COMMIT'.





  5.   ,  - , "" ( , ).





  6. !





BEGIN;
  DECLARE curs CURSOR FOR SELECT ctid, * FROM flow WHERE (it, dt) = (1, '2018-07-29') FOR UPDATE;

  FETCH 1 FROM curs;
  DELETE FROM flow WHERE ctid = ANY(...);
  -- processing
  INSERT INTO agg ...
  SAVEPOINT _1;
  
  FETCH 2 FROM curs;
  DELETE FROM flow WHERE ctid = ANY(...);
  -- processing
  INSERT INTO agg ...
  SAVEPOINT _2;
  
  FETCH 4 FROM curs;
  DELETE FROM flow WHERE ctid = ANY(...);
  -- processing...
  INSERT INTO agg ...
  -- oops! timeout exception!
  ROLLBACK TO _2;
  
  CLOSE curs;
COMMIT;
      
      



. , , !








All Articles