Merge pull request #45630 from CurtizJ/fix-performance-columns-description

Fix performance of short queries with `Array` columns
This commit is contained in:
Anton Popov 2023-01-27 14:59:55 +01:00 committed by GitHub
commit f10e82355e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 22 additions and 3 deletions

View File

@ -444,6 +444,7 @@ void IMergeTreeDataPart::setColumns(const NamesAndTypesList & new_columns, const
} }
columns_description = ColumnsDescription(columns); columns_description = ColumnsDescription(columns);
columns_description_with_collected_nested = ColumnsDescription(Nested::collect(columns));
} }
NameAndTypePair IMergeTreeDataPart::getColumn(const String & column_name) const NameAndTypePair IMergeTreeDataPart::getColumn(const String & column_name) const

View File

@ -143,6 +143,7 @@ public:
const NamesAndTypesList & getColumns() const { return columns; } const NamesAndTypesList & getColumns() const { return columns; }
const ColumnsDescription & getColumnsDescription() const { return columns_description; } const ColumnsDescription & getColumnsDescription() const { return columns_description; }
const ColumnsDescription & getColumnsDescriptionWithCollectedNested() const { return columns_description_with_collected_nested; }
NameAndTypePair getColumn(const String & name) const; NameAndTypePair getColumn(const String & name) const;
std::optional<NameAndTypePair> tryGetColumn(const String & column_name) const; std::optional<NameAndTypePair> tryGetColumn(const String & column_name) const;
@ -522,6 +523,10 @@ private:
/// to columns by name and getting subcolumns. /// to columns by name and getting subcolumns.
ColumnsDescription columns_description; ColumnsDescription columns_description;
/// The same as above but after call of Nested::collect().
/// It is used while reading from wide parts.
ColumnsDescription columns_description_with_collected_nested;
/// Reads part unique identifier (if exists) from uuid.txt /// Reads part unique identifier (if exists) from uuid.txt
void loadUUID(); void loadUUID();

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <Interpreters/Context.h> #include <Interpreters/Context.h>
#include <Storages/MergeTree/AlterConversions.h> #include <Storages/MergeTree/AlterConversions.h>
#include <Storages/ColumnsDescription.h>
#include <Core/NamesAndTypes.h> #include <Core/NamesAndTypes.h>
namespace DB namespace DB
@ -41,6 +42,10 @@ public:
virtual const NamesAndTypesList & getColumns() const = 0; virtual const NamesAndTypesList & getColumns() const = 0;
virtual const ColumnsDescription & getColumnsDescription() const = 0;
virtual const ColumnsDescription & getColumnsDescriptionWithCollectedNested() const = 0;
virtual std::optional<size_t> getColumnPosition(const String & column_name) const = 0; virtual std::optional<size_t> getColumnPosition(const String & column_name) const = 0;
virtual String getColumnNameWithMinimumCompressedSize(bool with_subcolumns) const = 0; virtual String getColumnNameWithMinimumCompressedSize(bool with_subcolumns) const = 0;

View File

@ -41,8 +41,12 @@ IMergeTreeReader::IMergeTreeReader(
, alter_conversions(data_part_info_for_read->getAlterConversions()) , alter_conversions(data_part_info_for_read->getAlterConversions())
/// For wide parts convert plain arrays of Nested to subcolumns /// For wide parts convert plain arrays of Nested to subcolumns
/// to allow to use shared offset column from cache. /// to allow to use shared offset column from cache.
, requested_columns(data_part_info_for_read->isWidePart() ? Nested::convertToSubcolumns(columns_) : columns_) , requested_columns(data_part_info_for_read->isWidePart()
, part_columns(data_part_info_for_read->isWidePart() ? Nested::collect(data_part_info_for_read->getColumns()) : data_part_info_for_read->getColumns()) ? Nested::convertToSubcolumns(columns_)
: columns_)
, part_columns(data_part_info_for_read->isWidePart()
? data_part_info_for_read->getColumnsDescriptionWithCollectedNested()
: data_part_info_for_read->getColumnsDescription())
{ {
columns_to_read.reserve(requested_columns.size()); columns_to_read.reserve(requested_columns.size());
serializations.reserve(requested_columns.size()); serializations.reserve(requested_columns.size());

View File

@ -104,7 +104,7 @@ private:
NamesAndTypesList requested_columns; NamesAndTypesList requested_columns;
/// Actual columns description in part. /// Actual columns description in part.
ColumnsDescription part_columns; const ColumnsDescription & part_columns;
}; };
} }

View File

@ -27,6 +27,10 @@ public:
const NamesAndTypesList & getColumns() const override { return data_part->getColumns(); } const NamesAndTypesList & getColumns() const override { return data_part->getColumns(); }
const ColumnsDescription & getColumnsDescription() const override { return data_part->getColumnsDescription(); }
const ColumnsDescription & getColumnsDescriptionWithCollectedNested() const override { return data_part->getColumnsDescriptionWithCollectedNested(); }
std::optional<size_t> getColumnPosition(const String & column_name) const override { return data_part->getColumnPosition(column_name); } std::optional<size_t> getColumnPosition(const String & column_name) const override { return data_part->getColumnPosition(column_name); }
AlterConversions getAlterConversions() const override { return data_part->storage.getAlterConversionsForPart(data_part); } AlterConversions getAlterConversions() const override { return data_part->storage.getAlterConversionsForPart(data_part); }