Postgresql
訂購聚合查詢
我有一個由 a
pk
、 anid
、一個整數value
和 atype
組成的表,其中包含 ~160,000,000 行。考慮表中的這些數據:CREATE TABLE foo(pk,id,value,type) AS VALUES ( '1' , '1', 'A1' , 1 ), ( '2' , '1', 'A2' , 2 ), ( '3' , '1', 'A3' , 3 ), ( '4' , '1', 'A4' , 4 ), ( '5' , '1', 'A5' , 5 ), ( '6' , '2', 'B1' , 1 ), ( '7' , '2', 'B2' , 2 ), ( '8' , '2', 'B3' , 3 ), ( '9' , '2', 'B4' , 4 ), ( '10', '2', 'B5' , 5 ) ;
我正在做這樣的查詢:
SELECT min(pk), id, array_agg(value ORDER BY type) AS v FROM foo GROUP BY id ORDER BY (array_agg(value ORDER BY type))[2] ; min | id | array_agg ------+-----+------------------ pk1 | id1 | {A1,A2,A3,A4,A5} pk10 | id2 | {B1,B2,B3,B4,B5}
該表可以具有所需的任何索引(目前所有單個列都單獨為 btree 索引)。
array_agg[n]
是否可以使用 btree 索引(在 1 到 5 之間)對該查詢進行排序,以便n
在合理的時間內進行排序?
ORDER BY (array_agg(value ORDER BY type))[2]
當type[2]
甚至不在索引上時,您如何期望在索引上執行?它是數組構造中的位置元素。value
如果您在索引上需要它,那麼規範化A2
和B2
是相同的,也許2
. 然後你離開了外部加入表本身..SELECT t.* FROM ( SELECT min(pk), id, array_agg(value ORDER BY type) AS v FROM foo GROUP BY id ) AS t LEFT OUTER JOIN ( SELECT id FROM foo WHERE value = '2' ) AS k USING (id) ORDER BY k.id, min, id;