From c139a6d209b12cc18b4022f8e72bb073b9c768be Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Tue, 22 Apr 2014 19:34:59 +0400 Subject: [PATCH] dbms: fixed bug in merge tree output stream: compression of min block now runs at the right moment [METR-10570] --- dbms/include/DB/Core/Defines.h | 2 +- .../MergeTree/MergedBlockOutputStream.h | 26 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/dbms/include/DB/Core/Defines.h b/dbms/include/DB/Core/Defines.h index 89b2461bf44..79f69403e72 100644 --- a/dbms/include/DB/Core/Defines.h +++ b/dbms/include/DB/Core/Defines.h @@ -23,7 +23,7 @@ /// Какими блоками по-умолчанию читаются и пишутся данные (в числе строк). #define DEFAULT_BLOCK_SIZE 1048576 /// То же самое, но для операций слияния. Меньше DEFAULT_BLOCK_SIZE для экономии оперативки (так как читаются все столбцы). -#define DEFAULT_MERGE_BLOCK_SIZE 10000 +#define DEFAULT_MERGE_BLOCK_SIZE 8192 #define DEFAULT_MAX_QUERY_SIZE 65536 #define SHOW_CHARS_ON_SYNTAX_ERROR 160L diff --git a/dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h b/dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h index ac30e09c4cd..9399a7f0091 100644 --- a/dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h +++ b/dbms/include/DB/Storages/MergeTree/MergedBlockOutputStream.h @@ -135,16 +135,19 @@ protected: else { limit = storage.index_granularity; + + /// Уже могло накопиться достаточно данных для сжатия в новый блок. + if (stream.compressed.offset() >= min_compress_block_size) + stream.compressed.next(); + writeIntBinary(stream.plain_hashing.count(), stream.marks); writeIntBinary(stream.compressed.offset(), stream.marks); } type_arr->serializeOffsets(column, stream.compressed, prev_mark, limit); - /// Уже могло накопиться достаточно данных для сжатия в новый блок. - if (stream.compressed.offset() >= min_compress_block_size) - stream.compressed.next(); - else - stream.compressed.nextIfAtEnd(); /// Чтобы вместо засечек, указывающих на конец сжатого блока, были засечки, указывающие на начало следующего. + + stream.compressed.nextIfAtEnd(); /// Чтобы вместо засечек, указывающих на конец сжатого блока, были засечки, указывающие на начало следующего. + prev_mark += limit; } } @@ -166,16 +169,19 @@ protected: else { limit = storage.index_granularity; + + /// Уже могло накопиться достаточно данных для сжатия в новый блок. + if (stream.compressed.offset() >= min_compress_block_size) + stream.compressed.next(); + writeIntBinary(stream.plain_hashing.count(), stream.marks); writeIntBinary(stream.compressed.offset(), stream.marks); } type.serializeBinary(column, stream.compressed, prev_mark, limit); - /// Уже могло накопиться достаточно данных для сжатия в новый блок. - if (stream.compressed.offset() >= min_compress_block_size) - stream.compressed.next(); - else - stream.compressed.nextIfAtEnd(); /// Чтобы вместо засечек, указывающих на конец сжатого блока, были засечки, указывающие на начало следующего. + + stream.compressed.nextIfAtEnd(); /// Чтобы вместо засечек, указывающих на конец сжатого блока, были засечки, указывающие на начало следующего. + prev_mark += limit; } }