gpt4 book ai didi

postgresql - 为什么 ALTER TABLE DROP CONSTRAINT 在空表上需要很长时间?

转载 作者:行者123 更新时间:2023-11-29 11:23:39 25 4
gpt4 key购买 nike

我试图在单个事务中将几百万行数据加载到一个表(一个包含用户表的两个外键以及这些键上的关联索引的“跟随”表)中。我最初的尝试导致我的脚本崩溃,因为系统内存已耗尽。

一些研究得出的结论是崩溃是因为外键约束,所以我验证了表是空的(即导致进程被杀死的事务没有完成)并将我的脚本修改为删除外键约束和索引以插入数据。我的意图是之后重新创建约束和索引。

但是,尽管表是完全空的,但删除表上第一个外键约束的 ALTER TABLE DROP CONSTRAINT 命令需要很长时间(几十分钟)。

我唯一能想到的是和我往表中写入大量数据然后没有commit有关,因为脚本崩溃了。但当然,由于事务未提交,我无法在数据库中找到该数据的任何踪迹。

什么可能导致此查询变慢(或者可能根本不运行;在撰写本文时它仍在进行中),我该如何避免?

数据库中还有其他事务打开(几个小时长的事务正在迁移其他非常大的表),但这些事务都没有触及下表。

编辑:pg锁如下:

db=#  select relation::regclass, * from pg_locks where not granted;
-[ RECORD 1 ]------+--------------------
relation           | auth_user
locktype           | relation
database           | 53664
relation           | 54195
page               | 
tuple              | 
virtualxid         | 
transactionid      | 
classid            | 
objid              | 
objsubid           | 
virtualtransaction | 5/343
pid                | 17300
mode               | AccessExclusiveLock
granted            | f

上面的 pid (17300) 只是 ALTER TABLE 查询本身。没有其他锁,也没有等待锁的进程。

最佳答案

检查 pg_locks 并验证没有其他事务在表上有锁。即使是读锁也会阻止 ALTER TABLE

\x

select
pg_class.relname,
pg_locks.*
from pg_locks
left outer join pg_class ON (pg_locks.relation = pg_class.oid)
where pg_locks.relation = 'auth_user'::regclass;

通过过滤原始查询中的 where not granted,您只显示未完成的锁,而不是阻止它们的锁。

这个锁没有被授予的事实告诉我这是一个锁问题。另一个事务持有此表的锁,阻止 ALTER TABLE 获取它需要继续执行的 AccessExclusiveLock。这可能只是在某个时候从表中SELECTed 的事务。

你可以通过加入 pg_stat_activity 找到它:

select 
c.relname,
l.*,
psa.*
from pg_locks l
inner join pg_stat_activity psa ON (psa.pid = l.pid)
left outer join pg_class c ON (l.relation = c.oid)
where l.relation = 'test'::regclass;

它将向您显示在该表中持有或等待锁的事务、锁是什么、这些事务当前正在运行什么语句等。

(对于旧版本的那些:pg_stat_activity.pid 曾经是 procpid。因此,如果您使用的是旧的 PostgreSQL,请适当更改查询。或更新。)

关于postgresql - 为什么 ALTER TABLE DROP CONSTRAINT 在空表上需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17605511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com