2017-05-12 25 views
0

我们需要包含索引大小而不锁定表。我尝试使用“同时创建索引..”,但它导致在其中一个系统上创建INVALID索引。我们尝试执行 - 删除索引 - 同时删除索引 - 重新索引表 但是间歇性地,他们也得到卡住。这使得通过脚本并发创建索引的整个方法很容易受到攻击。PostgreSQL并发索引创建 - 无效索引

任何想法如何在没有人工干预的情况下做到充分证明?如果不是的话,还有什么其他有效的方法可以在大型表和繁忙表上以自动化方式在PostgreSQL中包含索引大小。

+0

无效索引通常是由于运行时取消了并发索引创建。索引创建是否成功完成? –

+0

“含有指数大小”是什么意思?索引具有所需的大小,并且该大小不可配置。 “同时创建/删除索引”仍然需要在表格上进行排他锁定,但只需要很短的时间。没有办法避免这种情况,并且在一个可能会造成不良影响的繁忙服务器上。 –

+0

我的意思是减少随时间增长的PG表的索引大小 - 可以使用reindex table/create - drop index完成,但这两种都是侵入性技术 – user2350659

回答

0

为了在脚本中同时构建索引,您需要在下一个命令中添加逻辑(因为您无法进行事务处理)。只需检查下一行中的索引是否无效,如果是,则中止脚本。

另外我会扭转行动:首先你同时建立新的指数。如果成功,就放弃旧的。

https://www.postgresql.org/docs/current/static/sql-createindex.html

如果在扫描表,如死锁或 唯一性冲突唯一索引出现问题,CREATE INDEX命令将 失败,但留下一个“非法”索引。查询目的此索引将被忽略 ,因为它可能不完整;然而它会 仍然消耗更新开销。

另一个区别是常规的CREATE INDEX命令可以是事务块内执行 ,但CREATE INDEX CONCURRENTLY 不能。

+0

如何中止?我们检查了什么时候我们试图同时删除INDEX/DROP INDEX - 两者都被间歇性地卡住了,并且reindex正在花费很多时间去除创建的INVALID索引。 – user2350659

+0

reindex会重建无效索引。如何中止什么? –

+0

如何删除无效索引,即使我们试图删除无效索引时,即使DROP INDEX也被卡住了。 – user2350659