PostgreSQL中的Alter Table太慢了

Jul*_*ams 3 sql postgresql alter-table

我正在尝试添加新列

ALTER TABLE "Cidade" ADD COLUMN "BoundBox" VARCHAR(255)
Run Code Online (Sandbox Code Playgroud)

到此表:

 "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
Run Code Online (Sandbox Code Playgroud)

但是查询从未完成,我已经等了5分钟,什么也没发生。该表只有5,000条记录,由于它阻止了对该表的访问,我迫不及待地等待了太多时间。我有一个测试数据库(等于生产版),并且工作非常迅速。postgres版本是9.5.6。

Eug*_*nij 8

如果您运行的是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 != '{}';
Run Code Online (Sandbox Code Playgroud)


Lau*_*lbe 5

这个语句非常快,但是它需要对表进行访问排他锁。必须有一个长时间运行的事务持有表上的锁并阻止您。

使用pg_stat_activity视图查找长事务。


小智 5

如果没有任何东西阻止您的查询并且查询执行很长时间并且该表有许多 DELETE 查询,请尝试清理您的表:

VACUUM (VERBOSE, ANALYZE) table_name;
Run Code Online (Sandbox Code Playgroud)