mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
Attempt to fix suboptimal performance when running query with ORDER BY and without GROUP BY to distributed table with very many remote servers [#METR-21408].
This commit is contained in:
parent
ce94de168c
commit
b7a05d0608
@ -36,9 +36,8 @@ public:
|
||||
return res.str();
|
||||
}
|
||||
|
||||
void readPrefix() override
|
||||
void readPrefixImpl() override
|
||||
{
|
||||
children.back()->readPrefix();
|
||||
next();
|
||||
started = true;
|
||||
}
|
||||
|
@ -26,6 +26,10 @@ class IProfilingBlockInputStream : public IBlockInputStream
|
||||
public:
|
||||
Block read() override final;
|
||||
|
||||
/** Реализация по-умолчанию вызывает readPrefix() у всех детей рекурсивно, а затем readPrefixImpl() у себя.
|
||||
*/
|
||||
void readPrefix() override;
|
||||
|
||||
/** Реализация по-умолчанию вызывает рекурсивно readSuffix() у всех детей, а затем readSuffixImpl() у себя.
|
||||
* Если этот поток вызывает у детей read() в отдельном потоке, этот поведение обычно неверно:
|
||||
* readSuffix() у ребенка нельзя вызывать в момент, когда read() того же ребенка выполняется в другом потоке.
|
||||
@ -182,6 +186,9 @@ protected:
|
||||
/// Наследники должны реализовать эту функцию.
|
||||
virtual Block readImpl() = 0;
|
||||
|
||||
/// Здесь можно делать предварительную инициализацию.
|
||||
virtual void readPrefixImpl() {}
|
||||
|
||||
/// Здесь необходимо делать финализацию, которая может привести к исключению.
|
||||
virtual void readSuffixImpl() {}
|
||||
|
||||
|
@ -123,6 +123,7 @@ protected:
|
||||
|
||||
|
||||
Block readImpl() override;
|
||||
|
||||
void readSuffixImpl() override;
|
||||
|
||||
/// Инициализирует очередь и следующий блок результата.
|
||||
|
@ -96,6 +96,15 @@ Block IProfilingBlockInputStream::read()
|
||||
}
|
||||
|
||||
|
||||
void IProfilingBlockInputStream::readPrefix()
|
||||
{
|
||||
for (auto & child : children)
|
||||
child->readPrefix();
|
||||
|
||||
readPrefixImpl();
|
||||
}
|
||||
|
||||
|
||||
void IProfilingBlockInputStream::readSuffix()
|
||||
{
|
||||
for (auto & child : children)
|
||||
|
Loading…
Reference in New Issue
Block a user