From 692805fa3979b3474860304cfbafb2bcf09c897d Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 29 Aug 2012 20:23:19 +0000 Subject: [PATCH] dbms: development [#CONV-2944]. --- dbms/include/DB/Storages/StorageMergeTree.h | 27 ++++++++++++++++----- dbms/src/Storages/StorageMergeTree.cpp | 18 ++++++++++---- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/dbms/include/DB/Storages/StorageMergeTree.h b/dbms/include/DB/Storages/StorageMergeTree.h index 8e0569591ff..8c7e43e4297 100644 --- a/dbms/include/DB/Storages/StorageMergeTree.h +++ b/dbms/include/DB/Storages/StorageMergeTree.h @@ -10,10 +10,6 @@ #include -/// Задержка от времени модификации куска по-умолчанию, после которой можно объединять куски разного уровня. -#define DEFAULT_DELAY_TIME_TO_MERGE_DIFFERENT_LEVEL_PARTS 3600 - - namespace DB { @@ -49,6 +45,25 @@ struct Range; * пары записей с разными значениями sign_column для одного значения первичного ключа. * (см. CollapsingSortedBlockInputStream.h) */ + +struct StorageMergeTreeSettings +{ + /// В каких случаях можно объединять куски разного уровня. + ssize_t delay_time_to_merge_different_level_parts; + size_t max_level_to_merge_different_level_parts; + size_t max_rows_to_merge_different_level_parts; + + /// Куски настолько большого размера объединять нельзя вообще. + size_t max_rows_to_merge_parts; + + StorageMergeTreeSettings() : + delay_time_to_merge_different_level_parts(36000), + max_level_to_merge_different_level_parts(10), + max_rows_to_merge_different_level_parts(10 * 1024 * 1024), + max_rows_to_merge_parts(100 * 1024 * 1024) {} +}; + + class StorageMergeTree : public IStorage { friend class MergeTreeBlockInputStream; @@ -69,7 +84,7 @@ public: ASTPtr & primary_expr_ast_, const String & date_column_name_, size_t index_granularity_, const String & sign_column_ = "", - size_t delay_time_to_merge_different_level_parts_ = DEFAULT_DELAY_TIME_TO_MERGE_DIFFERENT_LEVEL_PARTS); + const StorageMergeTreeSettings & settings_ = StorageMergeTreeSettings()); ~StorageMergeTree(); @@ -119,7 +134,7 @@ private: /// Для схлопывания записей об изменениях, если это требуется. String sign_column; - size_t delay_time_to_merge_different_level_parts; + StorageMergeTreeSettings settings; SharedPtr primary_expr; SortDescription sort_descr; diff --git a/dbms/src/Storages/StorageMergeTree.cpp b/dbms/src/Storages/StorageMergeTree.cpp index 98b71c12e12..a17a1866982 100644 --- a/dbms/src/Storages/StorageMergeTree.cpp +++ b/dbms/src/Storages/StorageMergeTree.cpp @@ -639,12 +639,12 @@ StorageMergeTree::StorageMergeTree( ASTPtr & primary_expr_ast_, const String & date_column_name_, size_t index_granularity_, const String & sign_column_, - size_t delay_time_to_merge_different_level_parts_) + const StorageMergeTreeSettings & settings_) : path(path_), name(name_), full_path(path + escapeForFileName(name) + '/'), columns(columns_), context(context_), primary_expr_ast(primary_expr_ast_->clone()), date_column_name(date_column_name_), index_granularity(index_granularity_), sign_column(sign_column_), - delay_time_to_merge_different_level_parts(delay_time_to_merge_different_level_parts_), + settings(settings_), increment(full_path + "increment.txt"), log(&Logger::get("StorageMergeTree: " + name)) { /// создаём директорию, если её нет @@ -1153,6 +1153,7 @@ bool StorageMergeTree::selectPartsToMerge(DataPartPtr & left, DataPartPtr & righ /** Два первых подряд идущих куска одинакового минимального уровня, за один, одинаковый месяц. * Также проверяем, что куски неперекрываются. * (обратное может быть только после неправильного объединения кусков, если старые куски не были удалены) + * Также проверяем ограничение в settings. */ UInt32 min_adjacent_level = -1U; @@ -1163,7 +1164,9 @@ bool StorageMergeTree::selectPartsToMerge(DataPartPtr & left, DataPartPtr & righ && (*second)->left_month == (*second)->right_month && (*first)->right < (*second)->left && (*first)->level == (*second)->level - && (*first)->level < min_adjacent_level) + && (*first)->level < min_adjacent_level + && (*first)->size * index_granularity <= settings.max_rows_to_merge_parts + && (*second)->size * index_granularity <= settings.max_rows_to_merge_parts) { min_adjacent_level = (*first)->level; argmin_first = first; @@ -1191,9 +1194,10 @@ bool StorageMergeTree::selectPartsToMerge(DataPartPtr & left, DataPartPtr & righ /** Два подряд идущих куска минимальноего суммарного размера с временем создания * раньше текущего минус заданное, за один, одинаковый месяц. * Также проверяем, что куски неперекрываются, если не указан параметр merge_intersecting. + * Также проверяем ограничения в settings. */ - time_t cutoff_time = time(0) - delay_time_to_merge_different_level_parts; + time_t cutoff_time = time(0) - settings.delay_time_to_merge_different_level_parts; size_t min_adjacent_size = -1ULL; while (second != data_parts.end()) { @@ -1203,7 +1207,11 @@ bool StorageMergeTree::selectPartsToMerge(DataPartPtr & left, DataPartPtr & righ && (*first)->right < (*second)->left /// Куски неперекрываются. && (*first)->modification_time < cutoff_time && (*second)->modification_time < cutoff_time - && (*first)->size + (*second)->size < min_adjacent_size) + && (*first)->size + (*second)->size < min_adjacent_size + && (*first)->size * index_granularity <= settings.max_rows_to_merge_different_level_parts + && (*second)->size * index_granularity <= settings.max_rows_to_merge_different_level_parts + && (*first)->level <= settings.max_level_to_merge_different_level_parts + && (*second)->level <= settings.max_level_to_merge_different_level_parts) { min_adjacent_size = (*first)->size + (*second)->size; argmin_first = first;