2016-08-25 32 views
0

形勢模數分表,如何索引? PostgreSQL的

我有9.5的PostgreSQL數據庫的使用時間來存儲對象的位置。

我有一個主表名爲 「位置」 與列(只適用):

  • position_id
  • position_timestamp
  • OBJECT_ID

它是劃分爲100個表object_id條件:

CREATE TABLE position_object_id_00 
(CHECK object_id%100 = 0) 
INHERITS (position); 

等爲其他孩子。我用一個模數關係進行劃分以平均分配這些對象。 每個孩子都在position_id和object_id上索引(兩個不同的索引)。

問題

當我尋找對象通過它的ID,Postgres運行的索引掃描每個子表:

EXPLAIN ANALYZE 
SELECT * 
FROM position 
WHERE object_id = 3 

"Append (cost=0.43..35925.81 rows=51119 width=97) (actual time=0.109..46.362 rows=52418 loops=1)" 
" -> Index Scan using position_object_id_position_timestamp_idx on position (cost=0.43..34742.00 rows=24811 width=97) (actual time=0.108..15.367 rows=26209 loops=1)" 
"  Index Cond: (object_id = 3)" 
" -> Index Scan using position_object_id_00_object_id_idx on position_object_id_00 (cost=0.29..4.30 rows=1 width=97) (actual time=0.102..0.102 rows=0 loops=1)" 
"  Index Cond: (object_id = 3)" 
" -> Index Scan using position_object_id_01_object_id_idx on position_object_id_01 (cost=0.29..4.30 rows=1 width=97) (actual time=0.065..0.065 rows=0 loops=1)" 
"  Index Cond: (object_id = 3)" 
" -> Index Scan using position_object_id_02_object_id_idx on position_object_id_02 (cost=0.29..4.30 rows=1 width=97) (actual time=0.069..0.069 rows=0 loops=1)" 
"  Index Cond: (object_id = 3)" 
" -> Seq Scan on position_object_id_03 (cost=0.00..757.61 rows=26209 width=97) (actual time=0.030..5.337 rows=26209 loops=1)" 
"  Filter: (object_id = 3)" 
" -> Index Scan using position_object_id_04_object_id_idx on position_object_id_04 (cost=0.29..4.30 rows=1 width=97) (actual time=0.067..0.067 rows=0 loops=1)" 
"  Index Cond: (object_id = 3)" 

[...] 

除了從事實,那就是在我的主表數據(第一行)(請參閱關於Before and After trigger on the same event? Fill a child table PostgreSQL的主題),Postgres不會「識別」分區的檢查條件,並在每個子表上查找ID,而在表position_object_id_03中僅存在相應的ID。

是否有一種特定的索引方式,使它直接知道在哪張表上看?

謝謝你的幫助!

回答

1

Postgres無法自動將object_id = 3應用於檢查約束的知識,決定3 % 100 = 3並選擇相應的分區。暗示Postgres的挑哪個分區的唯一方法是明確使用從檢查約束的表達式中的查詢,如:

SELECT * FROM position WHERE object_id = 3 AND object_id % 100 = 3; 

順便說一句,我們正在開發用於分割的開源擴展(pg_pathman),其中已建成 - 支持哈希分區,並自動理解object_id = 3對應於某個分區。請檢查一下。

+0

謝謝你的回答。我也有一個字段「object_partition」,它將存儲'object_id%100',以便我們可以查詢'object_id = sth和object_partition = sth%100'。這很相似:) – Miwauke