Eu tenho duas tabelas left2
e right2
. Ambas as tabelas serão grandes (1-10 milhões de linhas).
CREATE TABLE left2(id INTEGER, t1 INTEGER, d INTEGER);
ALTER TABLE left2 ADD PRIMARY KEY (id,t1);
CREATE TABLE right2( t1 INTEGER, d INTEGER, arr INTEGER[] );
ALTER TABLE right2 ADD PRIMARY KEY(t1,d);
Vou realizar este tipo de consulta:
SELECT l.d + r.d,
UNIQ(SORT((array_agg_mult(r.arr)))
FROM left2 l,
right2 r
WHERE l.t1 = r.t1
GROUP BY l.d + r.d
ORDER BY l.d + r.d;
Onde para agregação de arrays utilizo a função:
CREATE AGGREGATE array_agg_mult(anyarray) (
SFUNC=array_cat,
STYPE=anyarray,
INITCOND='{}');
Após concatenar os arrays, utilizo a UNIQ
função do intarray
módulo. Existe uma maneira mais eficiente de fazer isso? Existe algum índice no arr
campo para acelerar a mesclagem (com remoção de duplicatas)? A função agregada pode remover duplicatas diretamente? As matrizes originais podem ser consideradas classificadas (e são únicas) se isso ajudar.
O SQL Fiddle está aqui :