diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.cpp b/src/Storages/MergeTree/MergedBlockOutputStream.cpp index adea78429c4c..512ca206252d 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 238a7de78214..fb2ba3ee0616 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1429,6 +1429,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, @@ -1438,7 +1454,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);