Partitions pas éliminées avec une sous-requête

Les utilisateurs n'aiment ni interrompre leur travail ni regarder le sablier
Répondre
Phil
Administrateur du site
Messages : 319
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Partitions pas éliminées avec une sous-requête

Message par Phil »

Merci à Guillaume pour sa question :

"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';
ou encore

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';
Enfin que le critère ne soit pas "enfermé" dans la sous-requête.
Cdlt. Phil - pgphil.ovh
Répondre