2016-07-04 1 views
-1

La requête suivante est très lent:spoeding une sélectionnez « distincte » avec LIMIT x dans Postgres

select distinct gene_symbol from my_table where gene_symbol like 'ED%' limit 15 

qui est pas surprenant, puisque les causes distinctes à faire un agrégat de hachage.

Cette version fonctionne beaucoup plus vite:

 with q0 as (
     SELECT gene_symbol from my_table WHERE gene_symbol like 'ED%' limit 200 
    ) 
     select distinct gene_symbol from q0 limit 15 

, mais l'inconvénient est que je dois modifier la limite de la requête interne, Si je mets trop élevé, il devient si je mets lent, il trop bas, je pourrais avoir moins de 15 lignes.

Y a-t-il un meilleur moyen?

+1

À moins que vous postez votre structure de la table, y compris les index et la sortie d'expliquer l'analyse, il est un cas d'aveugle conduisant l' – e4c5

Répondre

0

la requête semble simple, mais je laisse quelques alternatives

SELECT gene_symbol FROM my_table GROUP 1 LIMIT 15; 

SELECT p.gene_symbol 
FROM 
(SELECT 
gene_symbol 
FROM my_table GROUP 1) AS p 
ORDER BY 1 DESC|ASC 
LIMIT 15; 
+0

aveugle j'ai tort omis l'endroit où comme filtre dans le poste, la question n'est pas corrigée. votre seconde solution est aussi lente que le select distinct gene_symbol de my_table où gene_symbol comme 'ED%' limite 15; –

0
select distinct gene_symbol 
from my_table 
where gene_symbol like 'ED%' 
limit 15 
+0

appologies, c'est en fait la requête lente, j'ai omis par erreur l'endroit où le filtre dans le post ... –

+0

@MaxL. Si tel est le cas, votre requête _faster_ ne fait aucune différence. Poster 'expliquer analyser' pour les deux. –