在 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;
我正在尝试添加一个新列
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;