在 postgres 中改变 Table 太慢

Alter Table too slow in postgres

我正在尝试添加一个新列

ALTER TABLE "Cidade" ADD COLUMN "BoundBox" VARCHAR(255)

对此table:

 "Cidade"
    "Id" integer not null
        constraint "Cidade_PK"
            primary key,
    "Nome" varchar(120),
    "EstadoId" integer not null
        constraint "Estado_Cidade_FK"
            references "Estado",
    "PontoCentralLatitude" numeric,
    "PontoCentralLongitude" numeric

但是查询一直没有完成,我已经等了5分钟了,什么也没有发生。 table 只有 5,000 条记录,我不能等太多时间,因为它阻止了对 table 的访问。 我有一个测试数据库(与生产数据库相同),而且运行速度非常快。 postgres版本是9.5.6.

这条语句非常快,但是它需要table上的访问排他锁。必须有一个长 运行 事务持有 table 的锁并阻止你。

使用 pg_stat_activity 视图查找长事务。

根据你的描述,这个 table 似乎在系统中被高度使用,你的 alter 语句需要时间来获取 table 上的锁来完成这项工作。尝试找到 window 和 运行 可以减少系统负载的地方。

如果您是 运行 PostgreSQL 9.6+,您可以使用 pg_blocking_pids() 查找锁定您的查询的 PID。

select pid, pg_blocking_pids(pid) as blocked_by, query as blocked_query
from pg_stat_activity
where pg_blocking_pids(pid)::text != '{}';

如果没有任何东西阻止您的查询和查询执行很长时间并且此 table 有很多 DELETE 查询尝试清理您的 table:

VACUUM (VERBOSE, ANALYZE) table_name;