代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

PostgreSQL+表分区:效率低下的max()和min()。

  •  0
  • Adam Matan  · 技术社区  · 14 年前

    我在PostgreSQL表中存储了一个巨大的分区表。每个子表在其ID上都有一个索引和一个检查约束,例如(为了清晰起见,删除了不相关的数据):

    Master table: points
        Column     |            Type             |       Modifiers        
    ---------------+-----------------------------+------------------------
     id            | bigint                      |
     creation_time | timestamp without time zone | 
     the_geom      | geometry                    | 
    
    
    Sub-table points_01
        Column     |            Type             |        Modifiers        
    ---------------+-----------------------------+-------------------------
         id            | bigint                      | 
     creation_time | timestamp without time zone | 
     the_geom      | geometry                    | 
    
    Indexes:
        "points_01_pkey" PRIMARY KEY, btree (id)
        "points_01_creation_time_idx" btree (creation_time)
        "points_01_the_geom_idx" gist (the_geom) CLUSTER
    Check constraints:
        "enforce_srid_the_geom" CHECK (srid(the_geom) = 4326)
        "id_gps_points_2010_08_22__14_47_04_check" 
                   CHECK (id >= 1000000::bigint AND id <= 2000000::bigint)
    

    现在,

    SELECT max(id) FROM points_01
    

    是即时的,但是:

    SELECT max(id) FROM points
    

    哪个是主桌 points_01 .. points_60 并且应该很少花时间使用检查约束,因为查询计划器不使用检查约束,所以需要一个多小时。

    根据PostgreSQL wiki(最后一节 this page ,这是一个已知问题,将在下一个版本中修复。

    有没有一个好的方法可以让查询计划器利用子表的检查约束和索引 max() min() 查询?

    谢谢,

    亚当

    3 回复  |  直到 10 年前
        1
  •  1
  •   rfusca    14 年前

        2
  •  1
  •   Pablo Santa Cruz    14 年前

    db=> set enable_seqscan = off;
    db=> set enable_tidscan = off;
    db=> -- your query goes here
    

    bitmapscan indexscan

    seqscan tidscan

    db=> set enable_seqscan = on;
    db=> set enable_tidscan = on;
    

        3
  •  0
  •   ITroubs    14 年前

    SELECT id FROM points a WHERE id > ALL (SELECT id FROM x WHERE x.id != a.id)