Tengo una tabla myTable con cuatro columnas:
id UUID, user_id UUID , text VARCHAR , date TIMESTAMP ( id es la clave principal y user_id no es único en esta tabla)
Quiero recuperar los user_id de usuario ordenados por su entrada más reciente, lo que estoy haciendo actualmente con esta consulta:
SELECT user_id FROM myTable GROUP BY user_id ORDER BY MAX(date) DESC El problema es que GROUP BY lleva mucho tiempo. ¿Hay una manera más rápida de lograr esto? Intenté usar una función de ventana con PARTITION BY como se describe aquí Recuperando el último registro en cada grupo - MySQL , pero realmente no aceleró las cosas. También me aseguré de que user_id esté indexado.
Mi versión de postgres es 10.4
Editar: la consulta anterior que estoy usando actualmente es funcionalmente correcta, el problema es que es lenta.
Su consulta parece un enfoque relevante para su requisito:
select user_id from mytable group by user_id order by max(date) desc Recomendaría un índice en (user, date desc) para acelerar las cosas. Tiene que ser un solo índice en ambas columnas.
También puede intentar distinct on , que podría , o no, brindarle un mejor rendimiento:
select user_id from ( select distinct on(user_id) user_id, date from mytable order by user_id, date desc ) t order by date descComience con un índice en user_id, date desc . Eso podría ayudar.
También puede intentar filtrar, una vez que tenga dicho índice:
select t.user_id from myTable t where t.date = (select max(t2.date) from myTable t2 where t2.user_id = t.user_id ) order by t.date desc Sin embargo, es posible que el order by termine tomando casi tanto tiempo como el group by .
Esta versión definitivamente usará el índice para la subconsulta:
select user_id from (select distinct on (user_id) user_id, date from myTable t order by user_id, date desc ) t order by date desc;