Fix significant join performance regression

This commit is contained in:
Amos Bird 2022-06-14 21:14:18 +08:00
parent 94b33498ae
commit 9a6e6ccfaf
No known key found for this signature in database
GPG Key ID: 80D430DCBECFEDB4
2 changed files with 13 additions and 12 deletions

View File

@ -1003,15 +1003,13 @@ public:
/// If it's joinGetOrNull, we need to wrap not-nullable columns in StorageJoin.
for (size_t j = 0, size = right_indexes.size(); j < size; ++j)
{
auto column_from_block = block.getByPosition(right_indexes[j]);
if (type_name[j].type->lowCardinality() != column_from_block.type->lowCardinality())
{
JoinCommon::changeLowCardinalityInplace(column_from_block);
}
const auto & column_from_block = block.getByPosition(right_indexes[j]);
if (auto * nullable_col = typeid_cast<ColumnNullable *>(columns[j].get());
nullable_col && !column_from_block.column->isNullable())
nullable_col->insertFromNotNullable(*column_from_block.column, row_num);
else if (auto * lowcard_col = typeid_cast<ColumnLowCardinality *>(columns[j].get());
lowcard_col && !typeid_cast<const ColumnLowCardinality *>(column_from_block.column.get()))
lowcard_col->insertFromFullColumn(*column_from_block.column, row_num);
else
columns[j]->insertFrom(*column_from_block.column, row_num);
}
@ -1020,12 +1018,12 @@ public:
{
for (size_t j = 0, size = right_indexes.size(); j < size; ++j)
{
auto column_from_block = block.getByPosition(right_indexes[j]);
if (type_name[j].type->lowCardinality() != column_from_block.type->lowCardinality())
{
JoinCommon::changeLowCardinalityInplace(column_from_block);
}
columns[j]->insertFrom(*column_from_block.column, row_num);
const auto & column_from_block = block.getByPosition(right_indexes[j]);
if (auto * lowcard_col = typeid_cast<ColumnLowCardinality *>(columns[j].get());
lowcard_col && !typeid_cast<const ColumnLowCardinality *>(column_from_block.column.get()))
lowcard_col->insertFromFullColumn(*column_from_block.column, row_num);
else
columns[j]->insertFrom(*column_from_block.column, row_num);
}
}
}

View File

@ -0,0 +1,3 @@
<test>
<query tag='INNER'>SELECT count(c) FROM numbers_mt(100000000) AS a INNER JOIN (SELECT number, toString(number) AS c FROM numbers(2000000)) AS b ON (a.number % 10000000) = b.number</query>
</test>