5

データ量が多いため、アプリケーション DB をスケールアウトする必要があります。PostgreSQL 9.3 上にあります。それで、私は PostgreSQL-XL を見つけました。これはすばらしく見えますが、分散テーブルの制限について理解するのに苦労しています。レプリケーションによってそれらを分散する (すべてのデータノードでテーブル全体がレプリケートされる) ことはまったく問題ありませんが、データノードに沿って「分割」する必要がある 2 つの大きな関連テーブルがあるとします。

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

Postgre-XL のドキュメントには、次のように記載されています。

  • "(...) 分散テーブルでは、UNIQUE 制約にテーブルの分散列を含める必要があります"
  • 「(...)ディストリビューション列は PRIMARY KEY に含める必要があります」
  • "(...) REFERENCES (FK) を含む列は分散列にする必要があります。(...) PRIMARY KEY も分散列にする必要があります。"

彼らの例はあまりにも単純すぎて乏しいので、誰かがDISTRIBUTE BY HASH()を使用して postgres-XL の上記の 2 つのテーブルを DDL してくれませんか?

または、スケールアウトする他の方法を提案してください。

4

1 に答える 1

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

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

これで、任意の参加をfoos.id = foos_child.foo_idプッシュ ダウンしてローカルで実行できるようになりました。

于 2015-02-16T22:02:52.233 に答える