2017-02-10 1 views
0

Nous testons Apache Impala et nous avons remarqué qu'utiliser GROUP BY et LIKE ensemble fonctionne très lentement - les requêtes séparées fonctionnent beaucoup plus rapidement. Voici deux exemples:Lenteur des performances sur la requête Impala en utilisant Group By et Like

# 1.37s 1.08s 1.35s 

SELECT * FROM hive.default.pcopy1B where 
    (lower("by") like '%part%' and lower("by") like '%and%' and lower("by") like '%the%') 
    or (lower(title) like '%part%' and lower(title) like '%and%' and lower(title) like '%the%') 
    or (lower(url) like '%part%' and lower(url) like '%and%' and lower(url) like '%the%') 
    or (lower(text) like '%part%' and lower(text) like '%and%' and lower(text) like '%the%') 
limit 100; 

# 156.64s 155.63s 

select "by", type, ranking, count(*) from pcopy where 
    (lower("by") like '%part%' and lower("by") like '%and%' and lower("by") like '%the%') 
    or (lower(title) like '%part%' and lower(title) like '%and%' and lower(title) like '%the%') 
    or (lower(url) like '%part%' and lower(url) like '%and%' and lower(url) like '%the%') 
    or (lower(text) like '%part%' and lower(text) like '%and%' and lower(text) like '%the%') 
group by "by", type, ranking 
order by 4 desc limit 10; 

Quelqu'un pourrait-il s'il vous plaît expliquer pourquoi ce problème se produit, et s'il y a des solutions de contournement?

+0

Les deux requêtes me semblent très différentes. Le premier sélectionne simplement les enregistrements et n'a besoin que d'un curseur, le second doit récupérer tous les enregistrements et exécuter à la fois un groupe et un tri. S'il y a beaucoup d'enregistrements renvoyés, cela peut expliquer la différence de temps. Ou ai-je oublié quelque chose? – LSerni

Répondre

1

Il existe une différence fondamentale entre 2 requêtes.

1er Query

points principaux:

  • seulement 100 lignes sont sélectionnées.
  • Dès que le processus obtient 100 lignes qui satisfait la clause WHERE fournie, il est marqué comme terminé et 100 enregistrements seront retournés.
  • Il n'y aura qu'un seul pas de mappeur. Le nombre de mappeur dépend de la taille de vos données.

2 Requête

points principaux:

  • Seules 10 lignes sont sélectionnées.
  • Même si seulement 10 lignes sont sélectionnées, le processus doit analyser les données complètes afin de générer des résultats basés sur la clause GROUP BY.
  • Il devrait y avoir 3 étapes réducteur-mappeur. Le nombre de réducteurs-mappeurs à chaque étape dépend de la taille des données.
    • 1er MP lira les données et appliquer la clause WHERE
    • 2 MR sera pour GROUP BY article.
    • 3ème MR sera pour la clause ORDER BY.

Ainsi, les requêtes fournies par vous pourriez ressembler, mais ils sont totalement différents et permet de résoudre tous ensemble but différent.

J'espère que cela va vous aider.