如何在PostgreSQL中从一个分区查询多个表格

问题描述:

我在PostgreSQL中有一个大表分区,它是由不相交的条件决定的。如何在PostgreSQL中从一个分区查询多个表格

喜欢的东西:

CREATE TABLE child_table_1(check(my_condition = '01')) INHERITS (parent_table); 
// ... 
CREATE TABLE child_table_20(check(my_condition = '20')) INHERITS (parent_table); 

当我做一个查询,如:

EXPLAIN SELECT * FROM parent_table WHERE my_condition = '12' or my_condition = '14'; 

然后查询规划按预期工作,并显示:

Append (cost=0.00..21424.65 rows=100 width=60) 
    -> Seq Scan on parent_table (cost=0.00..0.00 rows=1 width=30) 
     Filter: ((my_condition = '12'::bpchar) OR (my_condition= '14'::bpchar)) 
    -> Seq Scan on child_table_12 (cost=0.00..14790.10 rows=50 width=20) 
     Filter: ((my_condition = '12'::bpchar) OR (my_condition = '14'::bpchar)) 
    -> Seq Scan on child_table_14 (cost=0.00..6634.55 rows=50 width=10) 
     Filter: ((my_condition = '12'::bpchar) OR (my_condition = '14'::bpchar)) 

但是,如果我尝试更动态的方法,

EXPLAIN SELECT * FROM parent_table WHERE my_condition = ANY(array['12','04'])

它变得疯了,它试图扫描分区中的所有表。

我该如何修改子表的条件以便识别它?

否则,我怎么能动态查询几个子表,而不写每个关键的条件。

+0

我有使用其他什么比一个等式,当连接中的检查约束传播的类似问题条件:http://*.com/questions/23565435/postgresql-check-contraints-not-passed-in-join。我很好奇看到任何回应。更具建设性的一点是,如果您对'my_condition'字段进行索引,索引至少应该认识到表中没有该条件的记录。这是完全跳过桌子的糟糕替代品。 – Hambone

+0

“IN”的静态版本起作用,即select * from parent_table WHERE my_condition IN('08','22')'。不过,我需要它将它用于具有可变输入的plpgsql函数。我发现的唯一方法是动态构建查询,这通常对SQL注入是开放的(尽管不是在我的情况下)。如果有人提供了一种方法来在函数内部使用值列表而无需构建查询,我将接受答案。 –

+0

我必须问......你在哪个版本上?我在9.3上试了这个,它的工作方式和你期望的完全一样。 '解释select * from parent_table where my_condition = any(array ['1','3'])'只扫描已插入表1和3 – Hambone

这是char(2)一个问题,如果是使用char varying(2)则使用分区创建父表:

https://www.postgresql.org/message-id/CA%2BbJJby9Bo6wkHMvLYhRRBt%2BiLApTuHCO_-Ljmx8BnZjyu8ncg%40mail.gmail.com