首页 > 数据库 >postgresql/lightdb中分区的Constraint Exclusion详解

postgresql/lightdb中分区的Constraint Exclusion详解

时间:2022-09-05 23:27:41浏览次数:114  
标签:01 postgresql Exclusion Constraint CREATE logdate measurement DATE TABLE

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

https://www.postgresql.org/message-id/flat/CAFjFpRcuRaydz88CY_aQekmuvmN2A9ax5z0k=ppT+s8KS8xMRA@mail.gmail.com

 

标签:01,postgresql,Exclusion,Constraint,CREATE,logdate,measurement,DATE,TABLE
From: https://www.cnblogs.com/zhjh256/p/16660021.html

相关文章

  • PostgreSQL-数据类型1
    一、数字类型整数类型:SQL仅指定整数类型integer(或int)、smallint和bigint。类型名称int2、int4和int8是扩展,其他一些SQL数据库系统也使用它们。数值类型num......
  • postGIS+postgreSQL+Supermap部署GIS数据
    1.在postGIS中创建XX_gisdb数据库,参数如下图所示,在架构中再创建gcj02架构;2.在超图中新建数据库型数据源;3.将要素表+字段表存在mdb个人地理数据库中,通过在超图中导入要素......
  • postgresql/lightdb CommandCounterIncrement()函数的作用
    CommandCounterIncrement的作用是使当前事务中前面语句的修改对本语句可见,相当于oracle中的当前读概念(currentread,只不过oracle区分,pg不区分)。事务中每执行一个语句后......
  • 论lightdb/postgresql中的search_path及实现兼容性管理
    上一篇介绍了lightdb/postgresqlpublic、pg_catalogschema的区别及pg_namespace概念,因为最近几个版本开发下来,遇到了很多兼容性挑战。所以这一节来专门讨论一下searc......
  • PostgreSQL-查询
    检索过程或从数据库中检索数据的命令称为查询。在SQL中,SELECT命令用于指定查询。SELECT命令的一般语法是:[WITHwith_queries]SELECTselect_listFROMtable_express......
  • PostgreSQL-从修改的行返回数据
    有时在操作修改的行时从修改的行中获取数据很有用。INSERT、UPDATE和DELETE命令都有一个可选的RETURNING子句来支持这一点。使用RETURNING可以避免执行额外的数据库......
  • PostgreSQL-插入
    创建表时,它不包含任何数据。在数据库发挥作用之前要做的第一件事就是插入数据。数据一次插入一行。您还可以在单​​个命令中插入多行,但不能插入不完整的行。即使您只知道......
  • PostgreSQL-表继承
    让我们从一个例子开始:假设我们正在尝试为城市构建一个数据模型。每个州都有许多城市,但只有一个首府。我们希望能够快速检索任何特定州的首都。这可以通过创建两张表来完成,......
  • PostgreSQL-schema
    数据库包含一个或多个命名模式,这些模式又包含表。模式还包含其他类型的命名对象,包括数据类型、函数和运算符。相同的对象名称可以在不同的模式中使用而不会发生冲突;例如,sch......
  • PostgreSQL-更改表
    当您创建一个表并意识到您犯了一个错误,或者应用程序的需求发生变化时,您可以删除该表并重新创建它。但是,如果表已经被数据填充,或者表被其他数据库对象引用(例如外键约束),这不......