5

Ho bisogno di ridimensionare il nostro DB di applicazioni a causa della quantità di dati. È su PostgreSQL 9.3. Quindi, ho trovato PostgreSQL-XL e sembra fantastico, ma sto facendo fatica a cercare di comprendere le limitazioni per le tabelle distribuite. Per distribuirli dalla replica (dove l'intera tabella viene replicata in ogni DataNode) è piuttosto male, ma diciamo che ho due grandi tabelle correlate che hanno bisogno di essere "sharded" lungo le datanodes:Migrazione da Postgresql a Postgres-XL: progettazione di tabelle distribuite

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 
); 

Ora documentazione Postgres-XL afferma che:

  • "(...) in tabelle distribuite, vincoli UNIQUE devono includere la colonna distribuzione della tabella"
  • "(...) la colonna di distribuzione deve essere incluso in PRIMARY KEY "
  • "(...) colonna con REFERENCES (FK) dovrebbe essere la colonna di distribuzione. (...) chiave primaria deve essere la colonna di distribuzione come pure ".

I loro esempi sono troppo semplicistico e scarsa, in modo da qualcuno può per favore mi DDL le due tabelle di cui sopra per Postgres-XL utilizzando DISTRIBUIRE IN HASH()?

O forse suggerire altri modi per scalare fuori?

risposta

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

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

Ora, qualsiasi join su foos.id = foos_child.foo_id può essere spinto verso il basso e fatto a livello locale.

+0

Grazie per la rapida risposta, ma l'avevo già provato, è stata la prima cosa che ho fatto, senza fortuna. Ottengo questo errore cercando di creare la prima tabella: 'ERRORE: l'indice univoco della tabella partizionata deve contenere la colonna di distribuzione hash. Suppongo che sia a causa del vincolo univoco, quindi diciamo che potrei sbarazzarmene, quindi ottengo questo altro errore: 'ERRORE: non esiste un vincolo univoco che corrisponda alle chiavi date per la tabella di riferimento" batch "' e questo è dovuto alla colonna di riferimento batch_id che è una chiave esterna e dovrebbe essere la colonna di distribuzione in una tabella distribuita, giusto? – Joe