2017-02-10 4 views
0

Мы тестируем Apache Impala и заметили, что использование GROUP BY и LIKE совместно работает очень медленно - отдельные запросы работают намного быстрее. Вот два примера:Медленная производительность по запросу Impala с использованием Group By and 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; 

Может кто-то пожалуйста, объясните, почему эта проблема возникает, и если есть какие-то обходные пути?

+0

Эти два вопроса кажутся мне совсем разными. Первый просто выбирает записи и нужен только один курсор, второй должен извлекать все записи и запускать как GROUP, так и SORT. Если возвращено очень много записей, это может объяснить разницу во времени. Или я что-то пропустил? – LSerni

ответ

1

Существует принципиальная разница между двумя запросами.

первого запроса

Основные моменты:

  • выбраны только 100 строк.
  • Как только процесс получает 100 строк, которые удовлетворяют предоставленному предложению, WHERE, он будет помечен как завершенный, и будет возвращено 100 записей.
  • Будет только 1 шаг карты. Количество преобразователей будет зависеть от размера данных.

второго запроса

Основные моменты:

  • выбраны только 10 строк.
  • Несмотря на то, что выбрано только 10 строк, процесс должен сканировать полные данные, чтобы генерировать результаты на основе GROUP BY.
  • Должно быть выполнено 3 этапа редуктора. Количество преобразователей на каждом шаге будет зависеть от размера данных.
    • первого МП будет считывать данные и применять WHERE пункт
    • второго MR будет для GROUP BY пункта.
    • 3rd MR будет для ORDER BY статья.

Так запросы, предоставляемые вам может выглядеть, но они совершенно разные, и решает все вместе разные цели.

Надеюсь, это поможет вам.