2016-06-07 55 views
1

美好的一天,Postgres按字符分區前綴

我想檢查什麼是最好的方式是在列前綴上分割Postgres表。我有一個大表(+ - 750萬行×10列),我想它在列的前綴1 數據看起來像分區:

ABCDEF1xxxxxxxx 
ABCDEF1xxxxxxxy 
ABCDEF1xxxxxxxz 
ABCDEF2xxxxxxxx 
ABCDEF2xxxxxxxy 
ABCDEF2xxxxxxxz 
ABCDEF3xxxxxxxx 
ABCDEF3xxxxxxxz 
ABCDEF4xxxxxxxx 
ABCDEF4xxxxxxxy 

他們唯一有史以來10將分區即ABCDEF0 ...-> ABCDEF9 ...

什麼我做目前是作出這樣的表:

CREATE TABLE public.mydata_ABCDEF1 (
CHECK (col1 like 'ABCDEF1%') 
) INHERITS (public.mydata); 

CREATE TABLE public.mydata_ABCDEF2 (
CHECK (col1 like 'ABCDEF2%') 
) INHERITS (public.mydata); 

等,然後用類似的邏輯觸發:

IF (NEW.col1 like 'ABCDEF1%') THEN 
    INSERT INTO public.mydata_ABCDEF1 VALUES (NEW.*); 
ELSIF (NEW.imsi like 'ABCDEF2%') THEN 
    INSERT INTO public.simdata_ABCDEF2 VALUES (NEW.*); 

我擔心如果以這種方式分區會加快查詢時間?或者如果我應該考慮在substr上進行分區(不知道如何),或者我應該在該列上創建一個帶有前綴和分區的新列?

任何建議表示讚賞。

回答

0

將顯著加快,你查詢時的分區表中的每一個都有各自的索引爲適當的分區,如:

CREATE INDEX ON public.mydata_ABCDEF1 (...) WHERE col1 like 'ABCDEF1%'; 
+0

是的,我打算索引「分區」表一旦數據被填充。我的問題更多的是如果使用「LIKE」分隔這個「字符」字段是最好的方法。 – QuickPrototype

0

簡短的回答是「可能不會」,但它實際上取決於準確你的查詢是什麼。

問題是真的 - 你想用分區來完成什麼?一般來說,PostgreSQL的btree索引在查找所需的特定記錄時非常快速高效 - 比PostgreSQL更快地計算出您有數據存儲在一組分區表中的哪個表。

其中分區是非常有用的是它有助於數據管理。之所以有用,是因爲您可以經常根據時間進行分區,然後當數據足夠老時,只需刪除較舊的分區,而不必發出將記錄標記爲已刪除的「DELETE」查詢,然後必須被VACUUM'd有空間回收,並最終導致在表和索引膨脹。

300M記錄是關於我可能考慮進行分區的一點,但我不會跳過去分區數據,而沒有明確的理由說明爲什麼分區數據會有所幫助。

另外,請注意PostgreSQL的查詢規劃器不能很好地處理大量的分區;數百和數千個分區將減慢計劃時間。這不是與前9.5版本非常明顯,但在9.5「EXPLAIN ANALYZE」將返回給定查詢所需的規劃時間:

=*> explain analyze select * from downloads; 
                 QUERY PLAN          
------------------------------------------------------------------------------------------------------- 
Seq Scan on downloads (cost=0.00..38591.76 rows=999976 width=193) (actual time=23.863..2088.732 rows= 
Planning time: 0.219 ms 
Execution time: 2552.878 ms 
(3 rows) 
+0

首先是一個更正,我有總數爲750萬行的數據。本質上它是設備的審覈歷史記錄,第1列中提到的是設備ID。 ABCDEF代表我們的公司,並且始終是ID的一部分。 0-9表示「bin」(因此最多隻有10個分區),後面是設備的實際ID。分區不適用於數據管理,因爲所有信息都是「永久」保存的。在我的情況下分區是純粹的表現。查詢將在設備ID上。選擇一個或在一個箱子上分組和計數等。 – QuickPrototype