PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres :pourquoi les performances sont-elles si mauvaises sur les sous-sélections avec décalage/limite ?

Je pense que la jointure exprimée dans la clause SELECT est exécutée même pour les 100 000 lignes que vous n'incluez pas dans l'ensemble de données final.

Que diriez-vous de ceci :

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

À défaut, essayez une expression de table courante :

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