Эффективность HAVING против подзапроса и почему - PullRequest
1 голос
/ 09 мая 2019

Когда я изучаю учебник по SQL HAVING, он говорит: HAVING - это «чистый» способ отфильтровать агрегированный запрос, но это также обычно делается с использованием подзапроса.

Иногда оператор HAVING эквивалентен подзапросу, например:

select account_id, sum(total_amt_usd) as sum_amount 
from demo.orders
group by account_id
having sum(total_amt_usd) >= 250000
select *
from (
    select account_id, sum(total_amt_usd) as sum_amount 
      from demo.orders
      group by account_id
      ) as subtable
where sum_amount >= 250000

Я хочу знать, какой из них рекомендуется, и причину, по которой он быстрее или эффективнее другого.

1 Ответ

1 голос
/ 09 мая 2019

Как и в случае с любым вопросом о производительности, вы должны попробовать его на своих данных. Но два должны быть по существу эквивалентны. Если вас интересуют такие вопросы, вам следует научиться читать планы выполнения.

Только одна заметка о MySQL. MySQL имеет тенденцию материализовать подзапросы. Это может привести к небольшим дополнительным расходам, если записать результаты group by перед их фильтрацией, но вы, вероятно, не заметите разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...