2014-10-19 69 views
0

我想GROUP BY列的數組值,這裏是表的定義:優化UNNEST intarray與GRO​​UP BY Postgres的

CREATE TABLE "public"."modifier_arrays" ( 
    "id" INTEGER DEFAULT nextval('modifier_arrays_id_seq'::regclass) NOT NULL UNIQUE, 
    "product_id" INTEGER NOT NULL, 
    "modifier_ids" INTEGER[] NOT NULL, 
    PRIMARY KEY ("id") 
); 
CREATE INDEX "modifier_ids_btree" ON "public"."modifier_arrays" USING btree("modifier_ids" ASC NULLS LAST); 
CREATE INDEX "modifier_ids_gin" ON "public"."modifier_arrays" USING gin("modifier_ids"); 

我填寫它與500K行,這裏是查詢我正在運行:

SELECT UNNEST(modifier_ids) AS modifier_id FROM modifier_arrays WHERE '{}' <@ modifier_ids GROUP BY UNNEST(modifier_ids); 

這裏是分析解釋:

HashAggregate (cost=51563.39..52068.64 rows=10000 width=43) (actual time=8705.943..8705.962 rows=101 loops=1) 
    -> Bitmap Heap Scan on modifier_arrays (cost=34387.54..51061.89 rows=200600 width=43)   (actual time=1683.227..5771.153 rows=10998944 loops=1) 
    Recheck Cond: ('{}'::integer[] <@ modifier_ids) 
    -> Bitmap Index Scan on modifier_ids_gin (cost=0.00..34387.04 rows=2006 width=0) (actual time=1676.215..1676.215 rows=2000000 loops=1) 
    Index Cond: ('{}'::integer[] <@ modifier_ids) 
    Total runtime: 8706.327 ms 

這是我曾嘗試:

SET work_mem = '550MB'; 
SET cpu_tuple_cost = 0.1; 
SET enable_seqscan = OFF; 

哦,這是我的Postgres版本:

PostgreSQL 9.1.14 

我仍然無法得到它降低到可接受的性能,我怎麼能優化這個查詢?我的想法/谷歌關鍵詞:(

+0

你能解釋你試圖實現這些行動? – vyegorov 2014-10-19 08:30:56

+0

我沒有收到這個查詢,你爲什麼使用'WHERE'{}'<@ modifier_ids'?它應該做什麼?不是'{}'評估爲胸罩的數值ce比較這個字符?並且'<@'的意思是不是絕對值?我缺少這些字符串和運算符的隱含或顯式內涵嗎?我發現你是UNNESTing,但是陣列創建在哪裏發生? – bf2020 2014-10-19 13:50:58

+0

@vyegorov:我想要GROUP BY數組元素,例如: 1 | {3,4} 2 | {4,5} 我想有像結果: (4,2) (3,1) (5,1) – wahyudinata 2014-10-19 21:41:10

回答

0

因爲你沒有做與骨料任何你可以選擇不同的

select distinct unnest(modifier_ids) as modifier_id 
from modifier_arrays 
where '{}' <@ modifier_ids; 
1

我發現這個問題,做了很多的插入/更新到後表,我跑了查詢,它真的很慢,我需要做的是真空分析表。有一個AUTOVACUUM設置的地方,我錯過了...