如何在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'])
它变得疯了,它试图扫描分区中的所有表。
我该如何修改子表的条件以便识别它?
否则,我怎么能动态查询几个子表,而不写每个关键的条件。
答
这是char(2)
一个问题,如果是使用char varying(2)
则使用分区创建父表:
我有使用其他什么比一个等式,当连接中的检查约束传播的类似问题条件:http://*.com/questions/23565435/postgresql-check-contraints-not-passed-in-join。我很好奇看到任何回应。更具建设性的一点是,如果您对'my_condition'字段进行索引,索引至少应该认识到表中没有该条件的记录。这是完全跳过桌子的糟糕替代品。 – Hambone
“IN”的静态版本起作用,即select * from parent_table WHERE my_condition IN('08','22')'。不过,我需要它将它用于具有可变输入的plpgsql函数。我发现的唯一方法是动态构建查询,这通常对SQL注入是开放的(尽管不是在我的情况下)。如果有人提供了一种方法来在函数内部使用值列表而无需构建查询,我将接受答案。 –
我必须问......你在哪个版本上?我在9.3上试了这个,它的工作方式和你期望的完全一样。 '解释select * from parent_table where my_condition = any(array ['1','3'])'只扫描已插入表1和3 – Hambone