在23万条记录和周围6个领域我的项目已被索引该表的。
早些时候,我测试的思考狮身人面像搜索添加增量列,但事实证明在保持整个数据库锁定了一个小时。 此后,当文件被添加,我尝试重建索引这是适用于大约4个小时的数据库锁查询:
"update user_messages set delta = false where delta = true"
那么为了使服务器最多我创建从数据库转储一个新的数据库,并促进它作为数据库服务器,从而可以实时开启。
现在,我期待的是,在我与出表锁表中增加增量列这可能吗? 而一旦列delta
加入,然后当我运行索引重建命令为什么上面的查询执行,为什么它阻塞服务器这么久?
PS:我在Heroku上,并使用与IKA DB模式的Postgres。
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;
你可以添加另一个表与一列,也不会有任何这样的长锁。 当然应该有另一列的外键的第一列。
对于索引,你可以使用“CREATE INDEX CONCURRENTLY”,它并没有在这个表上使用过重锁http://www.postgresql.org/docs/9.1/static/sql-createindex.html 。