首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加检查约束不会提高postgres表上附加分区的性能

添加检查约束不会提高postgres表上附加分区的性能
EN

Database Administration用户
提问于 2018-11-24 18:23:25
回答 1查看 1.3K关注 0票数 2

我试图将一个表合并到一个分区中,合并可以工作,但是性能不好。我读过链接,特别是这段话.

在运行附加分区命令之前,建议在要附加的表上创建一个CHECK约束,描述所需的分区约束。这样,系统就可以跳过扫描来验证隐式分区约束。如果没有这样的约束,将扫描表以验证分区约束,同时在父表上持有访问独占锁。在附加分区完成后,您可能会删除该约束,因为它不再是必要的。

这是我使用的SQL ..。

代码语言:javascript
复制
ALTER TABLE mess_201811 ADD CONSTRAINT const_201811 CHECK ( loadedtime >=  DATE '2018-11-01' AND loadedtime < DATE '2018-11-23' );
ALTER TABLE mess ATTACH PARTITION mess_201811 FOR VALUES FROM ('2018-11-01') TO ('2018-11-23'); 
ALTER TABLE mess_201811 DROP CONSTRAINT const_201811 ;

我已经尽可能地从上面提到的链接复制了我的SQL。这三个命令都没有问题地工作,问题是它所需的时间。添加约束大约需要60秒(很公平,表中大约有200万条记录)。但是附加分区命令也需要大约60秒,这意味着表正在被扫描第二次验证分区。我的理解是,有了CHECK约束,附加应该是一个简单的DDL语句,并且只需要一小部分秒。

问题是附加分区需要表混乱的排他锁,这样就不能插入60秒的记录。

我在用postgres v10.5。餐桌混乱的定义以

代码语言:javascript
复制
PARTITIONED BY loadedtime; 

在我进行测试时,数据库上没有其他用户,也没有锁问题。

在jjane解决方案之后,我检查了原始文档,引用的示例确实使用了NULL字段约束,尽管它没有提到这是强制性的。我希望附加的约束不会对这个表的正常插入产生明显的影响。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-11-25 16:50:05

我只能在mess_201811.loadedtime为空的情况下才能再现它,在这种情况下,必须在附件中扫描空值。如果列不是空,则跳过附件上的扫描。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/223336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档