Tengo dos tablas en psql que estoy tratando de unir en base a ciertos atributos - son muy grandes - 17 M de filas y 2.7 M de filas respectivamente
mydb=> SELECT reltuples::bigint AS estimate FROM pg_class where relname='foo';
estimate
----------
17087196
(1 row)
mydb=> SELECT reltuples::bigint AS estimate FROM pg_class where relname='bar';
estimate
----------
2763829
(1 row)
En ambos, he creado índices espaciales con
CREATE INDEX foo_gix ON foo USING GIST (the_geom);
La consulta que estoy ejecutando es un análisis de puntos en polígonos basado en datos recogidos en intervalos de tiempo históricos - contando puntos en polígonos cuando las marcas de tiempo en ambas tablas coinciden. Los puntos son ubicaciones de conexiones de teléfonos móviles ( bar_history
y bar
) y los polígonos son topes alrededor de ciertas áreas ( foo_history
, foo
)
Se ve así:
select s.id, s.place_id, s.time, count(l.location) as total
FROM foo_history as s LEFT JOIN foo as p ON s.place_id = p.id
LEFT JOIN bar_history l ON ST_Contains(ST_Buffer(ST_Transform(ST_SetSRID(ST_Centroid(p.polygon),
4326), 32615), 100), ST_Transform(l.location, 32615)) LEFT JOIN bar ON bar.phone_id = l.id
WHERE bar.network_id = 2
group by s.id LIMIT 5
Esta consulta devuelve los resultados con éxito en menos de unos segundos. Sin embargo, cuando añado la unión por marcas de tiempo:
select s.id, s.place_id, s.time, count(l.location) as total
FROM foo_history as s LEFT JOIN foo as p ON s.place_id = p.id
LEFT JOIN bar_history l ON ST_Contains(ST_Buffer(ST_Transform(ST_SetSRID(ST_Centroid(p.polygon),
4326), 32615), 100), ST_Transform(l.location, 32615)) LEFT JOIN bar ON bar.phone_id = l.id
WHERE bar.network_id = 2
AND
to_timestamp(floor((extract('epoch' from l.time::timestamp) / 600 )) * 600) =
to_timestamp(floor((extract('epoch' from s.time::timestamp) / 600 )) * 600)
group by s.id LIMIT 5
la consulta se ejecuta interminablemente, a pesar de que casi todas las marcas de tiempo coincidirán en ambas tablas. No soy un experto en bases de datos.
¿Cómo puedo acelerar esta consulta o añadir algún tipo de índice que la acelere?