Partitions pas éliminées avec une sous-requête
Posté : mar. 21 juil. 2026 16:35
Merci à Guillaume pour sa question :
"Avec PostgreSQL 17, j'ai une requête (elle est énormément simplifiée) de la forme
Les tables sont partitionnée sur c1 mais je lis toutes les partitions de t1, pourquoi ?"
Réponse:
La raison est que "The planner can only push quals down into a subquery, it cannot pull quals from a subquery into the outer query." , cf https://www.postgresql.org/message-id/C ... .gmail.com .
Qu'est-ce que cela signifie ? L'excellent critère T2.c1 = 'XXX" de la sous-requête ne sera pas exécutée pour éliminer des partitions de t1. Il faut donc plutôt écrire par exemple
ou encore
Enfin que le critère ne soit pas "enfermé" dans la sous-requête.
"Avec PostgreSQL 17, j'ai une requête (elle est énormément simplifiée) de la forme
Code : Tout sélectionner
select *
FROM
T1
where c1 in (select distinct T2.c1
from T2
where T2.c2 = 'XXX'
and T2.c1 = 'XXX');Les tables sont partitionnée sur c1 mais je lis toutes les partitions de t1, pourquoi ?"
Réponse:
La raison est que "The planner can only push quals down into a subquery, it cannot pull quals from a subquery into the outer query." , cf https://www.postgresql.org/message-id/C ... .gmail.com .
Qu'est-ce que cela signifie ? L'excellent critère T2.c1 = 'XXX" de la sous-requête ne sera pas exécutée pour éliminer des partitions de t1. Il faut donc plutôt écrire par exemple
Code : Tout sélectionner
select *
FROM
T1, (select distinct T2.c1
from T2
where T2.c2 = 'XXX'
) T2 where t1.c1 = t2.c1 and t2.c1 = 'XXX';Code : Tout sélectionner
select *
FROM
T1 join (select distinct T2.c1
from T2
where T2.c2 = 'XXX'
) T2 on (t1.c1 = t2.c1) where t2.c1 = 'XXX';