5

Ich muss aufgrund der Datenmenge unsere Anwendungs-DB skalieren. Es ist auf PostgreSQL 9.3. Also, ich habe PostgreSQL-XL gefunden und es sieht fantastisch aus, aber es fällt mir schwer, die Einschränkungen für verteilte Tabellen zu umgehen. So verteilen sie durch Replikation (wo die ganze Tabelle in jedem DataNode repliziert wird) ist ganz in Ordnung, aber wir sagen, dass ich zwei große verknüpften Tabellen haben, die brauchen „sharded“ entlang der Datanodes sein:Migration von Postgresql nach Postgres-XL: verteilte Tabellenentwurf

CREATE TABLE foos 
(
    id bigserial NOT NULL, 
    project_id integer NOT NULL, 
    template_id integer NOT NULL, 
    batch_id integer, 
    dataset_id integer NOT NULL, 
    name text NOT NULL, 
    CONSTRAINT pk_foos PRIMARY KEY (id), 
    CONSTRAINT fk_foos_batch_id FOREIGN KEY (batch_id) 
     REFERENCES batches (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_dataset_id FOREIGN KEY (dataset_id) 
     REFERENCES datasets (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_project_id FOREIGN KEY (project_id) 
     REFERENCES projects (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_template_id FOREIGN KEY (template_id) 
     REFERENCES templates (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT uc_foos UNIQUE (project_id, name) 
); 

CREATE TABLE foo_childs 
(
    id bigserial NOT NULL, 
    foo_id bigint NOT NULL, 
    template_id integer NOT NULL, 
    batch_id integer, 
    ffdata hstore, 
    CONSTRAINT pk_ff_foos PRIMARY KEY (id), 
    CONSTRAINT fk_fffoos_batch_id FOREIGN KEY (batch_id) 
     REFERENCES batches (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_fffoos_foo_id FOREIGN KEY (foo_id) 
     REFERENCES foos (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_fffoos_template_id FOREIGN KEY (template_id) 
     REFERENCES templates (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE 
); 

Jetzt Postgres-XL Dokumentation besagt, dass:

  • "(...) in verteilten Tabellen muss UNIQUE-Einschränkungen gehören die Verteilung Spalte der Tabelle"
  • „(...) die Verteilung Spalte enthalten sein müssen in Primärschlüssel "
  • "(...) Spalte mit REFERENZEN (FK) sollte die Verteilungsspalte sein. (...) Primärschlüssel muss die Verteilung Spalte als gut.“

Ihre Beispiele sind über vereinfachend und scarse, so kann jemand DDL mir bitte die beiden obigen Tabellen für Postgres-XL BY HASH DISTRIBUTE mit()?

Oder vielleicht schlagen andere Wege zu skalieren?

Antwort

0
CREATE TABLE foos 
(...) DISTRIBUTE BY HASH(id); 

CREATE TABLE foos_child 
(...) DISTRIBUTE BY HASH(foo_id); 

Nun kann jeder kommen auf foos.id = foos_child.foo_id nach unten geschoben werden kann und vor Ort durchgeführt.

+0

Danke für die schnelle Antwort, aber ich hatte es vorher versucht, es war das erste, was ich tat, ohne Glück. Ich bekomme diesen Fehler beim Versuch, die erste Tabelle zu erstellen: 'FEHLER: Eindeutiger Index der partitionierten Tabelle muss die Hash-Verteilungsspalte enthalten. Ich nehme an, dass es wegen der eindeutigen Einschränkung ist, also sagen wir, ich könnte es loswerden, dann bekomme ich das anderer Fehler: 'FEHLER: Es gibt keine eindeutige Integritätsbedingung, die gegebene Schlüssel für referenzierte Tabellen-" Batches "' gibt, und dies ist auf die referenzierende Spalte charge_id zurückzuführen, die ein Fremdschlüssel ist und die Verteilungsspalte in einer verteilten Tabelle sein sollte, richtig? – Joe