Postgres SELECT DISTINCT Does Not Scale
L'article décrit un problème de performance avec SELECT DISTINCT dans Postgres, qui, malgré un index approprié, balaie toutes les lignes correspondant aux prédicats au lieu de retourner seulement les valeurs distinctes. Ce comportement a été observé sur une file partitionnée où l'on cherchait les partitions actives et où la requête, attendue O(nombre de partitions), est devenue linéaire en nombre total de workflows en file. L'explication est que le planificateur effectue un balayage d'index complet car Postgres n'implémente pas d'opérateur de type "loose index scan" permettant de sauter vers chaque valeur unique sans parcourir toutes les entrées. La solution proposée consiste à reformuler la requête en utilisant une expression CTE récursive qui itère en prenant SELECT min() sur l'index pour récupérer une valeur unique par itération, limitant ainsi le travail à O(nombre de partitions). Des benchmarks confirment que la nouvelle approche maintient une latence stable quand on augmente le nombre de lignes par partition, alors que SELECT DISTINCT voit sa latence croître linéairement.