Postgresql

訂購聚合查詢

  • March 25, 2018

我有一個由 a pk、 an id、一個整數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如果您在索引上需要它,那麼規範化A2B2是相同的,也許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;

引用自:https://dba.stackexchange.com/questions/202222