sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:¿Por qué el rendimiento es tan malo en las subselecciones con Offset/Limit?

Creo que la unión expresada en la cláusula SELECT se ejecuta incluso para las 100000 filas que no está incluyendo en el conjunto de datos final.

¿Qué tal esto:

SELECT s2.user_id,
(SELECT address_id FROM address a WHERE a.user_id = s2.user_id ORDER BY address_id OFFSET 0 LIMIT 1) AS a_id
FROM (select *
      from   subscribers s
      ORDER BY s.user_id
      OFFSET 100000 LIMIT 200) s2

De lo contrario, intente con una expresión de tabla común:

With s2 as (
  select *
  from   subscribers s
  ORDER BY s.user_id
  OFFSET 100000 LIMIT 200)
SELECT s2.user_id,
(SELECT address_id FROM address a WHERE a.user_id = s2.user_id ORDER BY address_id OFFSET 0 LIMIT 1) AS a_id
FROM s2