假设我有这两张桌子
CREATE TABLE users (
id_user serial primary key,
name text NOT NULL
);
CREATE TABLE useless_table (
id serial primary key,
id_user int4 NOT NULL,
CONSTRAINT useless_table_id_user_fk FOREIGN KEY (id_user) REFERENCES users(id_user)
);
users
是所有数据库中最拥挤的表,查询不停,甚至是长而重要的查询,所以我无法杀死所有这些。useless_table
正如您所见,我想放弃它,它有一个外键引用users
,每次我启动DROP
命令时,它都会获得一个锁,即使是最简单的SELECT
(users
没有任何查询正在进行useless_table
)。我什至试图删除外键,useless_table
但它获得了与删除表相同的锁。
也许我是梦想家,但有没有办法让它不锁定所有东西而只是掉落useless_table
?
我正在考虑NOT VALID
外键、禁用触发器、可延迟约束或此类问题,但我对它们不是很了解,也不想使用它们弄得一团糟。
有什么建议吗?
不。“users”的用户必须以某种方式知道他们不再需要确保“useless_table”的引用完整性,并且让他们知道的唯一安全方法是更改“users”的元数据,这需要一把锁。
您将需要声明一个维护窗口,或者只是幸运地捕捉到处于解锁状态的“用户”。您可以在循环中运行下面的代码,直到幸运地尝试成功(如果锁不可用,nowait 将立即抛出错误)。您可能希望限制它不要尽可能快地循环,否则它会在某些您可能不想要的 LWLocks/spinlocks 上引起很多争用。