From f0e53fde642ab02f24431f684d894ab635180755 Mon Sep 17 00:00:00 2001 From: Maksim Kita Date: Wed, 29 Nov 2023 12:35:16 +0300 Subject: [PATCH 1/2] MergeTree mutations reuse source part index granularity --- src/Storages/MergeTree/MergedBlockOutputStream.cpp | 5 +++-- src/Storages/MergeTree/MergedBlockOutputStream.h | 3 ++- src/Storages/MergeTree/MutateTask.cpp | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Storages/MergeTree/MergedBlockOutputStream.cpp b/src/Storages/MergeTree/MergedBlockOutputStream.cpp index 20c9f5ca7f01..07a204d4325a 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.cpp +++ b/src/Storages/MergeTree/MergedBlockOutputStream.cpp @@ -24,7 +24,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_) @@ -48,7 +49,7 @@ MergedBlockOutputStream::MergedBlockOutputStream( data_part->version.setCreationTID(tid, nullptr); data_part->storeVersionMetadata(); - writer = data_part->getWriter(columns_list, metadata_snapshot, skip_indices, statistics, default_codec, writer_settings, {}); + writer = data_part->getWriter(columns_list, metadata_snapshot, skip_indices, statistics, 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 770bcfb05a0b..540b3b3bffab 100644 --- a/src/Storages/MergeTree/MergedBlockOutputStream.h +++ b/src/Storages/MergeTree/MergedBlockOutputStream.h @@ -25,7 +25,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 6b6b5947581b..71bb08b6ef28 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1535,7 +1535,8 @@ class MutateAllPartColumnsTask : public IExecutableTask ctx->txn, /*reset_columns=*/ true, /*blocks_are_granules_size=*/ false, - ctx->context->getWriteSettings()); + ctx->context->getWriteSettings(), + ctx->source_part->index_granularity); ctx->mutating_pipeline = QueryPipelineBuilder::getPipeline(std::move(builder)); ctx->mutating_pipeline.setProgressCallback(ctx->progress_callback); From 6578fe5baa7ef9832cb3b0c0fc51941ec5bb169d Mon Sep 17 00:00:00 2001 From: Maksim Kita Date: Wed, 29 Nov 2023 16:21:07 +0300 Subject: [PATCH 2/2] Updated implementation --- src/Storages/MergeTree/MutateTask.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Storages/MergeTree/MutateTask.cpp b/src/Storages/MergeTree/MutateTask.cpp index 71bb08b6ef28..214a7ea56a1f 100644 --- a/src/Storages/MergeTree/MutateTask.cpp +++ b/src/Storages/MergeTree/MutateTask.cpp @@ -1525,6 +1525,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, @@ -1536,7 +1552,7 @@ class MutateAllPartColumnsTask : public IExecutableTask /*reset_columns=*/ true, /*blocks_are_granules_size=*/ false, ctx->context->getWriteSettings(), - ctx->source_part->index_granularity); + computed_granularity); ctx->mutating_pipeline = QueryPipelineBuilder::getPipeline(std::move(builder)); ctx->mutating_pipeline.setProgressCallback(ctx->progress_callback);