我想GROUP BY列的數組值,這裏是表的定義:優化UNNEST intarray與GROUP 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
我仍然無法得到它降低到可接受的性能,我怎麼能優化這個查詢?我的想法/谷歌關鍵詞:(
你能解釋你試圖實現這些行動? – vyegorov 2014-10-19 08:30:56
我沒有收到這個查詢,你爲什麼使用'WHERE'{}'<@ modifier_ids'?它應該做什麼?不是'{}'評估爲胸罩的數值ce比較這個字符?並且'<@'的意思是不是絕對值?我缺少這些字符串和運算符的隱含或顯式內涵嗎?我發現你是UNNESTing,但是陣列創建在哪裏發生? – bf2020 2014-10-19 13:50:58
@vyegorov:我想要GROUP BY數組元素,例如: 1 | {3,4} 2 | {4,5} 我想有像結果: (4,2) (3,1) (5,1) – wahyudinata 2014-10-19 21:41:10