La cláusula SELECT DISTINCT en PostgreSQL presenta un comportamiento de rendimiento contraintuitivo: su complejidad de ejecución escala con el tamaño total de la tabla, no con el número de valores únicos. Esto significa que, independientemente de las índices utilizados, la consulta escanea cada fila que cumple las condiciones, lo que la convierte en un cuello de botella crítico en cargas de trabajo a gran escala.
En un caso de estudio de DBOS, este problema afectó a un sistema de colas particionadas. Aunque la consulta parecía eficiente para cargas de trabajo 'ancho y poco profundo', se volvió inaceptablemente lenta en escenarios 'estrechos y profundos', donde el tiempo de ejecución crecía linealmente con el número de filas en lugar de con el número de particiones activas. El análisis del plan de consulta reveló que PostgreSQL realizaba un escaneo completo del índice, recuperando todas las filas para verificar la unicidad de la clave de partición, en lugar de buscar solo los valores únicos.
A diferencia de MySQL, que ofrece un 'escaneo de índice suelto' para recuperar solo valores únicos, PostgreSQL no implementó esta optimización de forma nativa. Aunque la versión 18 introdujo una 'skip scan' limitada, no resuelve el problema en este contexto específico. La solución propuesta consiste en utilizar una expresión común tabular recursiva (CTE) que simula un bucle imperativo. Esta técnica permite obtener un solo valor a la vez en cada iteración, logrando una complejidad de O(número de particiones) y eliminando la dependencia del tamaño total de la tabla.
