在从 Postgres 9.4 到 Greenplum 的数据迁移过程中,我应该如何处理我的 UNIQUE 约束

Posted

技术标签:

【中文标题】在从 Postgres 9.4 到 Greenplum 的数据迁移过程中,我应该如何处理我的 UNIQUE 约束【英文标题】:How should I deal with my UNIQUE constraints during my data migration from Postgres9.4 to Greenplum 【发布时间】:2016-12-06 03:43:12 【问题描述】:

当我在 greenplum 中执行以下 sql(包含在 Postgres9.4 的pg_dump 生成的 sql 文件中)时:

CREATE TABLE "public"."trm_concept" (
"pid" int8 NOT NULL,
"code" varchar(100)  NOT NULL,
"codesystem_pid" int8,
"display" varchar(400) ,
"index_status" int8,
CONSTRAINT "trm_concept_pkey" PRIMARY KEY ("pid"),
CONSTRAINT "idx_concept_cs_code" UNIQUE ("codesystem_pid", "code")
);

我收到了这个错误:

ERROR:  Greenplum Database does not allow having both PRIMARY KEY and UNIQUE constraints

为什么 greenplum 不允许这样做?我真的需要这个独特的约束来保证一些规则,我该如何在 greenplum 中修复它?

【问题讨论】:

1) 因为 greenplum 是 Postgres 的简化版本 2) 您可以尝试用唯一索引替换唯一约束。 @joop 我很遗憾地说唯一索引的行为与唯一约束相同... 这是dba.stackexchange.com的一个更好的问题 因为 Greenplum 是一个强大的分析数据库引擎,而不是 OLTP 数据库。一般建议是不要在 Greenplum 中使用索引和唯一约束。此外,Greenplum 不是 PostgreSQL。它是 PostgreSQL 8.2 的一个分支,自该分支以来已经走过了很长一段路。 @JonRoberts 谢谢... 【参考方案1】: UNIQUE 约束通过 btree 索引完成 主键隐含UNIQUENOT NULL GreenPlum 分发给子/分片或您声称为 UNIQUE 的任何内容。

为了让 GreenTree 实现 UNIQUE 约束——如你所愿——该索引必须是

复制给每个孩子 以符合 ACID 的方式更新

这样做会完全消除运行 GreenPlum 的好处。你也可以回到 PostgreSQL。

From the docs about CREATE TABLE

创建表时,有一个附加子句来声明Greenplum数据库的分布策略。 如果未提供 DISTRIBUTED BY 或 DISTRIBUTED RANDOMLY 子句,则 Greenplum 使用 PRIMARY KEY(如果表有一个)或表的第一列作为分布键为表分配哈希分布策略。 几何或用户定义数据类型的列不适合作为 Greenplum 分布键列。如果表没有符合条件的数据类型的列,则将基于循环或随机分布对行进行分布。为了确保您的 Greenplum 数据库系统中数据的均匀分布,您希望为每条记录选择一个唯一的分布键,或者如果这不可能,则选择 DISTRIBUTED RANDOMLY。

同一个文档对 PRIMARY KEY 这么说,

对于一个表来说,要有一个主键,它必须是散列分布的(不是随机分布的),并且主键唯一的列必须包含Greenplum分布键的所有列。

这是CREATE INDEX 上的文档

在 Greenplum 数据库中,仅当索引键的列与 Greenplum 分布键相同(或超集)时才允许使用唯一索引。在分区表上,唯一索引仅支持在单个分区内,而不是跨所有分区。

【讨论】:

Tks,你的话这样做会完全消除运行GreenPlum的好处。你还不如回到 PostgreSQL。 让我对 greenplum 有所了解。【参考方案2】:

许多(也许是大多数)分析数据库不支持此类约束。 Greenplum 在支持可执行的PRIMARY KEY 方面有些独特。

FWIW,在 Redshift 中,我在更改数据的任何 ETL 步骤之后运行额外的逻辑,以确保我的约束仍然有效。

您可以在此处尝试相同的方法,但我强烈建议您在要检查的列上对表进行分区。

【讨论】:

谢谢,我将删除我的主键,并保留我的唯一约束。

以上是关于在从 Postgres 9.4 到 Greenplum 的数据迁移过程中,我应该如何处理我的 UNIQUE 约束的主要内容,如果未能解决你的问题,请参考以下文章

使用 postgres 9.4 将 JSON 元素附加到数组

在较旧的 Postgres (9.4) 上使用 Django 3+

RDS postgres 从 9.4 升级到 9.5,CPU 卡在 100% 几个小时

Postgres 8.3 中的位图扫描比索引扫描 Postgres 9.4 快 2 倍?

在 Postgres 9.4 中查找 JSON 数组中的最后一项

如何在 postgres 9.4 中删除复制槽