postgresql/lightdb中分区的Constraint Exclusion详解
在postgresql 10支持声明式分区之前,分区是通过继承实现的,如下:
CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ); CREATE TABLE measurement_y2006m02 ( CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2006m03 ( CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) ) INHERITS (measurement); ... CREATE TABLE measurement_y2007m11 ( CHECK ( logdate >= DATE '2007-11-01' AND logdate < DATE '2007-12-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2007m12 ( CHECK ( logdate >= DATE '2007-12-01' AND logdate < DATE '2008-01-01' ) ) INHERITS (measurement); CREATE TABLE measurement_y2008m01 ( CHECK ( logdate >= DATE '2008-01-01' AND logdate < DATE '2008-02-01' ) ) INHERITS (measurement); CREATE INDEX measurement_y2006m02_logdate ON measurement_y2006m02 (logdate); CREATE INDEX measurement_y2006m03_logdate ON measurement_y2006m03 (logdate); CREATE INDEX measurement_y2007m11_logdate ON measurement_y2007m11 (logdate); CREATE INDEX measurement_y2007m12_logdate ON measurement_y2007m12 (logdate); CREATE INDEX measurement_y2008m01_logdate ON measurement_y2008m01 (logdate);
从上可知,基于继承实现的分区是通过在子表上施加不重叠的约束条件实现的。分区的目的是为了更少的访问数据,所以配套的,有个特性来实现不访问子表、但是排除它的目的。它就是约束排除(Constraint Exclusion),在PostgreSQL 8.1中开始支持,通过参数constraint_exclusion控制,默认是partition,表示仅针对分区表启用约束排除,也就是table必须有个属性inher,一般来说足够,因为针对非分区表判断意义不大,总是要检查约束的。
在声明式分区中,对应的参数选项为enable_partition_pruning,默认值同样启用,enable_partition_pruning相比constraint_exclusion要强大得多,也支持执行时剪除,所以目前基本可以废弃constraint_exclusion。
http://www.light-pg.com/docs/lightdb/13.3-22.2/ddl-partitioning.html#DDL-PARTITIONING-USING-INHERITANCE
A Guide to Constraint Exclusion (Partitioning)
https://www.postgresonline.com/journal/archives/39-Constraint-Exclusion-when-it-fails-to-work.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-09-05 unrecognized command line option ‘-Wimplicit-fallthrough=3’
2016-09-05 nginx/ajax跨子域请求的两种现代方法以及403解决