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:
Alexey Milovidov 2016-05-20 23:01:34 +03:00
parent ce94de168c
commit b7a05d0608
4 changed files with 18 additions and 2 deletions

View File

@ -36,9 +36,8 @@ public:
return res.str();
}
void readPrefix() override
void readPrefixImpl() override
{
children.back()->readPrefix();
next();
started = true;
}

View File

@ -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() {}

View File

@ -123,6 +123,7 @@ protected:
Block readImpl() override;
void readSuffixImpl() override;
/// Инициализирует очередь и следующий блок результата.

View File

@ -96,6 +96,15 @@ Block IProfilingBlockInputStream::read()
}
void IProfilingBlockInputStream::readPrefix()
{
for (auto & child : children)
child->readPrefix();
readPrefixImpl();
}
void IProfilingBlockInputStream::readSuffix()
{
for (auto & child : children)