From 63a7d3439e9d2fc0c44880cc9fc53e6d13ed9fd0 Mon Sep 17 00:00:00 2001 From: robot-clickhouse Date: Mon, 4 Dec 2023 14:04:59 +0000 Subject: [PATCH] Backport #57352 to 23.8: MergeTree mutations reuse source part index granularity --- .../MergeTree/MergedBlockOutputStream.cpp | 5 +++-- .../MergeTree/MergedBlockOutputStream.h | 3 ++- src/Storages/MergeTree/MutateTask.cpp | 19 ++++++++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.cpp b/src/Storages/MergeTree/MergedBlockOutputStream.cpp index bfd9e92b4eb6..7afa8701a485 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.cpp +++ b/src/Storages/MergeTree/MergedBlockOutputStream.cpp @@ -23,7 +23,8 @@ MergedBlockOutputStream::MergedBlockOutputStream( const MergeTreeTransactionPtr & txn, bool reset_columns_, bool blocks_are_granules_size, - const WriteSettings & write_settings_) + const WriteSettings & write_settings_, + const MergeTreeIndexGranularity & computed_index_granularity) : IMergedBlockOutputStream(data_part, metadata_snapshot_, columns_list_, reset_columns_) , columns_list(columns_list_) , default_codec(default_codec_) @@ -47,7 +48,7 @@ MergedBlockOutputStream::MergedBlockOutputStream( data_part->version.setCreationTID(tid, nullptr); data_part->storeVersionMetadata(); - writer = data_part->getWriter(columns_list, metadata_snapshot, skip_indices, default_codec, writer_settings, {}); + writer = data_part->getWriter(columns_list, metadata_snapshot, skip_indices, default_codec, writer_settings, computed_index_granularity); } /// If data is pre-sorted. diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.h b/src/Storages/MergeTree/MergedBlockOutputStream.h index 20e6de5a99b9..d8ce15fdc0c6 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.h +++ b/src/Storages/MergeTree/MergedBlockOutputStream.h @@ -23,7 +23,8 @@ class MergedBlockOutputStream final : public IMergedBlockOutputStream const MergeTreeTransactionPtr & txn, bool reset_columns_ = false, bool blocks_are_granules_size = false, - const WriteSettings & write_settings = {}); + const WriteSettings & write_settings = {}, + const MergeTreeIndexGranularity & computed_index_granularity = {}); Block getHeader() const { return metadata_snapshot->getSampleBlock(); } diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index 865c2a87240a..510a7e5e82be 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1414,6 +1414,22 @@ class MutateAllPartColumnsTask : public IExecutableTask ctx->minmax_idx = std::make_shared(); + MergeTreeIndexGranularity computed_granularity; + bool has_delete = false; + + for (auto & command_for_interpreter : ctx->for_interpreter) + { + if (command_for_interpreter.type == MutationCommand::DELETE) + { + has_delete = true; + break; + } + } + + /// Reuse source part granularity if mutation does not change number of rows + if (!has_delete && ctx->execute_ttl_type == ExecuteTTLType::NONE) + computed_granularity = ctx->source_part->index_granularity; + ctx->out = std::make_shared( ctx->new_data_part, ctx->metadata_snapshot, @@ -1423,7 +1439,8 @@ class MutateAllPartColumnsTask : public IExecutableTask ctx->txn, /*reset_columns=*/ true, /*blocks_are_granules_size=*/ false, - ctx->context->getWriteSettings()); + ctx->context->getWriteSettings(), + computed_granularity); ctx->mutating_pipeline = QueryPipelineBuilder::getPipeline(std::move(builder)); ctx->mutating_pipeline.setProgressCallback(ctx->progress_callback);