-->

没有表级锁添加新列?(Add new column without table lock?)

2019-06-24 02:37发布

在23万条记录和周围6个领域我的项目已被索引该表的。

早些时候,我测试的思考狮身人面像搜索添加增量列,但事实证明在保持整个数据库锁定了一个小时。 此后,当文件被添加,我尝试重建索引这是适用于大约4个小时的数据库锁查询:

"update user_messages set delta = false where delta = true"

那么为了使服务器最多我创建从数据库转储一个新的数据库,并促进它作为数据库服务器,从而可以实时开启。

现在,我期待的是,在我与出表锁表中增加增量列这可能吗? 而一旦列delta加入,然后当我运行索引重建命令为什么上面的查询执行,为什么它阻塞服务器这么久?

PS:我在Heroku上,并使用与IKA DB模式的Postgres。

Answer 1:

PostgreSQL中更新的方式,写行的新版本。 你的问题不提供所有的信息,但是这可能意味着写百万计的新行。

如果您的数据模型和可用磁盘空间允许的话, CREATE一个新表的背景,然后,在一个交易: DROP旧表, RENAME新的。
详细信息和注意事项在此上dba.SE相关答案后 。

此外,如果表中的一个主要部分受到影响,做群众前删除所有索引UPDATE ,因为所有的指标都必须得更新。 这是更快地删除它们并重新创建它们的大规模更新完成后。

最后,在创建背景的新表:应用所有更改一次,或者您所创建的受影响的行的多个更新版本。

免责声明:添加没有新的列DEFAULT (= DEFAULT NULL )通常不会创建一个新的行,是非常便宜的本身。 增加值,它会创建新行。
详细的maunal 。

如果不能删除,因为约束的原始表,另一种快速的方法是建立一个临时表, TRUNCATE原来和质量INSERT新行-分类,如果这有助于提高性能。 所有在一个事务中。 事情是这样的:

BEGIN

SET temp_buffers = 1000MB;  -- or whatever you can spare temporarily

CREATE TEMP TABLE tmp AS
SELECT * FROM tbl LIMIT 0; -- copy layout of table

ALTER TABLE tmp ADD column delta boolean; -- NOT DEFAULT

INSERT INTO tmp (col1, col2, ... , delta)
SELECT col1, col2, ... , FALSE
FROM   tbl;                -- copy existing rows plus new value
-- ORDER BY ???

-- DROP all indexes here

TRUNCATE tbl;              -- empty table - truncate is super fast

ALTER TABLE tbl ADD column delta boolean DEFAULT FALSE; -- NOT NULL?

INSERT INTO tbl
SELECT * FROM tmp;         -- insert back surviving rows.

-- recreate all indexes here

COMMIT;


Answer 2:

你可以添加另一个表与一列,也不会有任何这样的长锁。 当然应该有另一列的外键的第一列。

对于索引,你可以使用“CREATE INDEX CONCURRENTLY”,它并没有在这个表上使用过重锁http://www.postgresql.org/docs/9.1/static/sql-createindex.html 。



文章来源: Add new column without table lock?