dbms: improved performance of queries with GROUP BY and LIMIT but without HAVING and ORDER BY [#METR-2944].

This commit is contained in:
Alexey Milovidov 2013-11-03 21:36:37 +00:00
parent 1c4b47fea2
commit d98f41ba3d

View File

@ -481,7 +481,21 @@ void InterpreterSelectQuery::executeAggregation(BlockInputStreams & streams, Exp
AggregateDescriptions aggregates;
query_analyzer->getAggregateInfo(key_names, aggregates);
/// TODO: Оптимизация для случая, когда есть LIMIT, но нет HAVING и ORDER BY.
/** Оптимизация для случая, когда есть LIMIT, но нет HAVING и ORDER BY.
* Будем агрегировать по первым попавшимся limit_length + limit_offset ключам.
* NOTE: после этого перестаёт точно работать rows_before_limit_at_least (это нормально).
* NOTE: возможно, неправильно работает, если после GROUP BY делается arrayJoin.
*/
size_t limit_length = 0;
size_t limit_offset = 0;
getLimitLengthAndOffset(query, limit_length, limit_offset);
if (query.limit_length && !query.having_expression && !query.order_expression_list
&& (!settings.limits.max_rows_to_group_by || limit_length + limit_offset < settings.limits.max_rows_to_group_by))
{
settings.limits.max_rows_to_group_by = limit_length + limit_offset;
settings.limits.group_by_overflow_mode = Limits::ANY;
}
bool separate_totals = to_stage > QueryProcessingStage::WithMergeableState;