2016-01-13 82 views
1

我在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://stackoverflow.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

回答