在postgresql中创建主键需要几天时间

在postgresql中创建主键需要几天时间,sql,postgresql,psql,rpostgresql,Sql,Postgresql,Psql,Rpostgresql,我试图将表写入PostgreSQL数据库,然后声明一个主键。我的数据非常庞大(包括数十亿行,总大小约为150GB),当我在写完表后尝试创建主键时,需要花费很长时间。下面是我如何定义主键的 ALTER TABLE my_huge_table ADD CONSTRAINT huge_pk PRIMARY KEY (column_x,column_y) 我确信这些列的唯一性,并且它们不是空的。什么都不等待真的是多余的,我在寻找一条避免浪费时间的逃生路线。我肯定认为有人面临这样的情况。等待你宝贵的帮助

我试图将表写入PostgreSQL数据库,然后声明一个主键。我的数据非常庞大(包括数十亿行,总大小约为150GB),当我在写完表后尝试创建主键时,需要花费很长时间。下面是我如何定义主键的

ALTER TABLE my_huge_table ADD CONSTRAINT huge_pk PRIMARY KEY (column_x,column_y)

我确信这些列的唯一性,并且它们不是空的。什么都不等待真的是多余的,我在寻找一条避免浪费时间的逃生路线。我肯定认为有人面临这样的情况。等待你宝贵的帮助。

你不是在等待什么。您可能正在等待建立索引。将来需要该索引来强制执行主键。如果系统信任您的声明,即它已经是唯一的,那么这真的不会给您带来太多好处,它仍然需要构建索引。如果您相信现在没有违反主键,并且相信将来没有人会尝试违反它,那么不要添加主键。只需添加一条注释,说明您知道这是一个主键,但出于性能原因,我们不会正式声明它。

Checkout@SimonMartinelli谢谢。为了确保这一点,如果我们将创建一个唯一索引然后将其用作主键与创建一个主键而不定义唯一键进行比较,那么哪一个会花费更少的时间?从本主题中,我了解到它不会锁定表上的操作,但我的主要目标是减少创建主键的时间。如果它比我的方式花费更少的时间,我可以很高兴地采用这种方式。你应该检查解释,你应该检查系统正在忙什么。它可能忙于顺序读取和排序。您应该有足够的临时空间进行排序,并且应该在操作系统上看到CPU和IO的负载大致相同。当IO基本为零时,您不希望在99%的CPU上运行,也不希望在CPU几乎处于空闲状态时IO 100%耗尽(进程始终处于IO等待状态)。由于您主要是排序,您可能会在临时空间上受到IO限制,如果您的物理RAM已完全加载,您可能无能为力。当然,请确保您正在使用所有物理RAM,并且有足够的工作内存分配给后端进程。