在PostgreSQL中,修改表结构的速度太慢。

22

我正在尝试添加新的列

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

到这张表格:

 "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分钟也没有任何反应。这张表只有5,000条记录,而且我不能等太久,因为它会阻塞对表的访问。 我有一个测试数据库(与生产环境相同),它运行非常快。 Postgres版本为9.5.6。

4个回答

42

如果您正在运行 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 != '{}';

9

这个语句执行速度非常快,但需要对表进行独占锁定。可能存在一个长时间运行的事务正在持有该表的锁并阻塞你。

使用pg_stat_activity视图查找长时间运行的事务。


5
如果查询没有任何阻碍且执行时间很长,而且该表有许多DELETE语句,请尝试清理您的表:
VACUUM (VERBOSE, ANALYZE) table_name;

索引也可能是问题的原因。感谢提醒。 - Pat Migliaccio

3
根据您的描述,似乎该表在系统中被广泛使用,您的修改语句需要获取表上的锁来完成工作,因此需要找到系统负载较低的时间段运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接