mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 01:51:59 +00:00
remove more projections code
This commit is contained in:
parent
2fd0f7be7b
commit
e0d469b0e0
@ -590,7 +590,7 @@ bool optimizeUseAggregateProjections(QueryPlan::Node & node, QueryPlan::Nodes &
|
|||||||
else if (!candidates.real.empty())
|
else if (!candidates.real.empty())
|
||||||
{
|
{
|
||||||
auto ordinary_reading_select_result = reading->selectRangesToRead(parts, alter_conversions);
|
auto ordinary_reading_select_result = reading->selectRangesToRead(parts, alter_conversions);
|
||||||
size_t ordinary_reading_marks = ordinary_reading_select_result->marks();
|
size_t ordinary_reading_marks = ordinary_reading_select_result->selected_marks;
|
||||||
|
|
||||||
/// Nothing to read. Ignore projections.
|
/// Nothing to read. Ignore projections.
|
||||||
if (ordinary_reading_marks == 0)
|
if (ordinary_reading_marks == 0)
|
||||||
@ -599,7 +599,7 @@ bool optimizeUseAggregateProjections(QueryPlan::Node & node, QueryPlan::Nodes &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto & parts_with_ranges = ordinary_reading_select_result->partsWithRanges();
|
const auto & parts_with_ranges = ordinary_reading_select_result->parts_with_ranges;
|
||||||
|
|
||||||
/// Selecting best candidate.
|
/// Selecting best candidate.
|
||||||
for (auto & candidate : candidates.real)
|
for (auto & candidate : candidates.real)
|
||||||
|
@ -142,7 +142,7 @@ bool optimizeUseNormalProjections(Stack & stack, QueryPlan::Nodes & nodes)
|
|||||||
MergeTreeDataSelectExecutor reader(reading->getMergeTreeData());
|
MergeTreeDataSelectExecutor reader(reading->getMergeTreeData());
|
||||||
|
|
||||||
auto ordinary_reading_select_result = reading->selectRangesToRead(parts, alter_conversions);
|
auto ordinary_reading_select_result = reading->selectRangesToRead(parts, alter_conversions);
|
||||||
size_t ordinary_reading_marks = ordinary_reading_select_result->marks();
|
size_t ordinary_reading_marks = ordinary_reading_select_result->selected_marks;
|
||||||
|
|
||||||
/// Nothing to read. Ignore projections.
|
/// Nothing to read. Ignore projections.
|
||||||
if (ordinary_reading_marks == 0)
|
if (ordinary_reading_marks == 0)
|
||||||
@ -151,7 +151,7 @@ bool optimizeUseNormalProjections(Stack & stack, QueryPlan::Nodes & nodes)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto & parts_with_ranges = ordinary_reading_select_result->partsWithRanges();
|
const auto & parts_with_ranges = ordinary_reading_select_result->parts_with_ranges;
|
||||||
|
|
||||||
std::shared_ptr<PartitionIdToMaxBlock> max_added_blocks = getMaxAddedBlocks(reading);
|
std::shared_ptr<PartitionIdToMaxBlock> max_added_blocks = getMaxAddedBlocks(reading);
|
||||||
|
|
||||||
|
@ -250,23 +250,17 @@ bool analyzeProjectionCandidate(
|
|||||||
context->getSettingsRef().max_threads,
|
context->getSettingsRef().max_threads,
|
||||||
max_added_blocks);
|
max_added_blocks);
|
||||||
|
|
||||||
if (projection_result_ptr->error())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
candidate.merge_tree_projection_select_result_ptr = std::move(projection_result_ptr);
|
candidate.merge_tree_projection_select_result_ptr = std::move(projection_result_ptr);
|
||||||
candidate.sum_marks += candidate.merge_tree_projection_select_result_ptr->marks();
|
candidate.sum_marks += candidate.merge_tree_projection_select_result_ptr->selected_marks;
|
||||||
|
|
||||||
if (!normal_parts.empty())
|
if (!normal_parts.empty())
|
||||||
{
|
{
|
||||||
/// TODO: We can reuse existing analysis_result by filtering out projection parts
|
/// TODO: We can reuse existing analysis_result by filtering out projection parts
|
||||||
auto normal_result_ptr = reading.selectRangesToRead(std::move(normal_parts), std::move(alter_conversions));
|
auto normal_result_ptr = reading.selectRangesToRead(std::move(normal_parts), std::move(alter_conversions));
|
||||||
|
|
||||||
if (normal_result_ptr->error())
|
if (normal_result_ptr->selected_marks != 0)
|
||||||
return false;
|
|
||||||
|
|
||||||
if (normal_result_ptr->marks() != 0)
|
|
||||||
{
|
{
|
||||||
candidate.sum_marks += normal_result_ptr->marks();
|
candidate.sum_marks += normal_result_ptr->selected_marks;
|
||||||
candidate.merge_tree_ordinary_select_result_ptr = std::move(normal_result_ptr);
|
candidate.merge_tree_ordinary_select_result_ptr = std::move(normal_result_ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Interpreters/ActionsDAG.h>
|
#include <Interpreters/ActionsDAG.h>
|
||||||
#include <Processors/QueryPlan/QueryPlan.h>
|
#include <Processors/QueryPlan/QueryPlan.h>
|
||||||
|
#include <Processors/QueryPlan/ReadFromMergeTree.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
class ReadFromMergeTree;
|
|
||||||
|
|
||||||
using PartitionIdToMaxBlock = std::unordered_map<String, Int64>;
|
using PartitionIdToMaxBlock = std::unordered_map<String, Int64>;
|
||||||
|
|
||||||
struct ProjectionDescription;
|
struct ProjectionDescription;
|
||||||
|
|
||||||
class MergeTreeDataSelectExecutor;
|
class MergeTreeDataSelectExecutor;
|
||||||
|
|
||||||
struct MergeTreeDataSelectAnalysisResult;
|
|
||||||
using MergeTreeDataSelectAnalysisResultPtr = std::shared_ptr<MergeTreeDataSelectAnalysisResult>;
|
|
||||||
|
|
||||||
class IMergeTreeDataPart;
|
|
||||||
using DataPartPtr = std::shared_ptr<const IMergeTreeDataPart>;
|
|
||||||
using DataPartsVector = std::vector<DataPartPtr>;
|
|
||||||
struct RangesInDataParts;
|
|
||||||
|
|
||||||
struct StorageInMemoryMetadata;
|
|
||||||
using StorageMetadataPtr = std::shared_ptr<const StorageInMemoryMetadata>;
|
|
||||||
|
|
||||||
struct SelectQueryInfo;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace DB::QueryPlanOptimizations
|
namespace DB::QueryPlanOptimizations
|
||||||
@ -61,8 +45,8 @@ struct ProjectionCandidate
|
|||||||
/// Analysis result, separate for parts with and without projection.
|
/// Analysis result, separate for parts with and without projection.
|
||||||
/// Analysis is done in order to estimate the number of marks we are going to read.
|
/// Analysis is done in order to estimate the number of marks we are going to read.
|
||||||
/// For chosen projection, it is reused for reading step.
|
/// For chosen projection, it is reused for reading step.
|
||||||
MergeTreeDataSelectAnalysisResultPtr merge_tree_projection_select_result_ptr;
|
ReadFromMergeTree::AnalysisResultPtr merge_tree_projection_select_result_ptr;
|
||||||
MergeTreeDataSelectAnalysisResultPtr merge_tree_ordinary_select_result_ptr;
|
ReadFromMergeTree::AnalysisResultPtr merge_tree_ordinary_select_result_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This function fills ProjectionCandidate structure for specified projection.
|
/// This function fills ProjectionCandidate structure for specified projection.
|
||||||
|
@ -246,7 +246,7 @@ ReadFromMergeTree::ReadFromMergeTree(
|
|||||||
bool sample_factor_column_queried_,
|
bool sample_factor_column_queried_,
|
||||||
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read_,
|
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read_,
|
||||||
Poco::Logger * log_,
|
Poco::Logger * log_,
|
||||||
MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr_,
|
AnalysisResultPtr analyzed_result_ptr_,
|
||||||
bool enable_parallel_reading)
|
bool enable_parallel_reading)
|
||||||
: SourceStepWithFilter(DataStream{.header = MergeTreeSelectProcessor::transformHeader(
|
: SourceStepWithFilter(DataStream{.header = MergeTreeSelectProcessor::transformHeader(
|
||||||
storage_snapshot_->getSampleBlockForColumns(real_column_names_),
|
storage_snapshot_->getSampleBlockForColumns(real_column_names_),
|
||||||
@ -1254,7 +1254,7 @@ Pipe ReadFromMergeTree::spreadMarkRangesAmongStreamsFinal(
|
|||||||
return merging_pipes.empty() ? Pipe::unitePipes(std::move(no_merging_pipes)) : Pipe::unitePipes(std::move(merging_pipes));
|
return merging_pipes.empty() ? Pipe::unitePipes(std::move(no_merging_pipes)) : Pipe::unitePipes(std::move(merging_pipes));
|
||||||
}
|
}
|
||||||
|
|
||||||
MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions) const
|
std::vector<AlterConversionsPtr> alter_conversions) const
|
||||||
{
|
{
|
||||||
@ -1454,7 +1454,7 @@ void ReadFromMergeTree::applyFilters()
|
|||||||
buildIndexes(indexes, filter_actions_dag, data, prepared_parts, context, query_info, metadata_for_reading);
|
buildIndexes(indexes, filter_actions_dag, data, prepared_parts, context, query_info, metadata_for_reading);
|
||||||
}
|
}
|
||||||
|
|
||||||
MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions,
|
std::vector<AlterConversionsPtr> alter_conversions,
|
||||||
const PrewhereInfoPtr & prewhere_info,
|
const PrewhereInfoPtr & prewhere_info,
|
||||||
@ -1490,7 +1490,7 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
|||||||
indexes);
|
indexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
ReadFromMergeTree::AnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions,
|
std::vector<AlterConversionsPtr> alter_conversions,
|
||||||
const StorageMetadataPtr & metadata_snapshot_base,
|
const StorageMetadataPtr & metadata_snapshot_base,
|
||||||
@ -1527,27 +1527,26 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
|||||||
buildIndexes(indexes, query_info.filter_actions_dag, data, parts, context, query_info, metadata_snapshot);
|
buildIndexes(indexes, query_info.filter_actions_dag, data, parts, context, query_info, metadata_snapshot);
|
||||||
|
|
||||||
if (indexes->part_values && indexes->part_values->empty())
|
if (indexes->part_values && indexes->part_values->empty())
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{.result = std::move(result)});
|
return std::make_shared<AnalysisResult>(std::move(result));
|
||||||
|
|
||||||
if (settings.force_primary_key && indexes->key_condition.alwaysUnknownOrTrue())
|
if (settings.force_primary_key && indexes->key_condition.alwaysUnknownOrTrue())
|
||||||
{
|
{
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{
|
throw Exception(ErrorCodes::INDEX_NOT_USED,
|
||||||
.result = std::make_exception_ptr(Exception(
|
|
||||||
ErrorCodes::INDEX_NOT_USED,
|
|
||||||
"Primary key ({}) is not used and setting 'force_primary_key' is set",
|
"Primary key ({}) is not used and setting 'force_primary_key' is set",
|
||||||
fmt::join(primary_key_column_names, ", ")))});
|
fmt::join(primary_key_column_names, ", "));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DEBUG(log, "Key condition: {}", indexes->key_condition.toString());
|
LOG_DEBUG(log, "Key condition: {}", indexes->key_condition.toString());
|
||||||
|
|
||||||
if (indexes->part_offset_condition)
|
if (indexes->part_offset_condition)
|
||||||
LOG_DEBUG(log, "Part offset condition: {}", indexes->part_offset_condition->toString());
|
LOG_DEBUG(log, "Part offset condition: {}", indexes->part_offset_condition->toString());
|
||||||
|
|
||||||
if (indexes->key_condition.alwaysFalse())
|
if (indexes->key_condition.alwaysFalse())
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{.result = std::move(result)});
|
return std::make_shared<AnalysisResult>(std::move(result));
|
||||||
|
|
||||||
size_t total_marks_pk = 0;
|
size_t total_marks_pk = 0;
|
||||||
size_t parts_before_pk = 0;
|
size_t parts_before_pk = 0;
|
||||||
try
|
|
||||||
{
|
{
|
||||||
MergeTreeDataSelectExecutor::filterPartsByPartition(
|
MergeTreeDataSelectExecutor::filterPartsByPartition(
|
||||||
indexes->partition_pruner,
|
indexes->partition_pruner,
|
||||||
@ -1574,14 +1573,13 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
|||||||
log);
|
log);
|
||||||
|
|
||||||
if (result.sampling.read_nothing)
|
if (result.sampling.read_nothing)
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{.result = std::move(result)});
|
return std::make_shared<AnalysisResult>(std::move(result));
|
||||||
|
|
||||||
for (const auto & part : parts)
|
for (const auto & part : parts)
|
||||||
total_marks_pk += part->index_granularity.getMarksCountWithoutFinal();
|
total_marks_pk += part->index_granularity.getMarksCountWithoutFinal();
|
||||||
parts_before_pk = parts.size();
|
parts_before_pk = parts.size();
|
||||||
|
|
||||||
auto reader_settings = getMergeTreeReaderSettings(context, query_info);
|
auto reader_settings = getMergeTreeReaderSettings(context, query_info);
|
||||||
|
|
||||||
result.parts_with_ranges = MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipIndexes(
|
result.parts_with_ranges = MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipIndexes(
|
||||||
std::move(parts),
|
std::move(parts),
|
||||||
std::move(alter_conversions),
|
std::move(alter_conversions),
|
||||||
@ -1596,10 +1594,6 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
|||||||
result.index_stats,
|
result.index_stats,
|
||||||
indexes->use_skip_indexes);
|
indexes->use_skip_indexes);
|
||||||
}
|
}
|
||||||
catch (...)
|
|
||||||
{
|
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{.result = std::current_exception()});
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t sum_marks_pk = total_marks_pk;
|
size_t sum_marks_pk = total_marks_pk;
|
||||||
for (const auto & stat : result.index_stats)
|
for (const auto & stat : result.index_stats)
|
||||||
@ -1631,7 +1625,7 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToReadImpl(
|
|||||||
? ReadType::InOrder
|
? ReadType::InOrder
|
||||||
: ReadType::InReverseOrder;
|
: ReadType::InReverseOrder;
|
||||||
|
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(MergeTreeDataSelectAnalysisResult{.result = std::move(result)});
|
return std::make_shared<AnalysisResult>(std::move(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadFromMergeTree::requestReadingInOrder(size_t prefix_size, int direction, size_t limit)
|
bool ReadFromMergeTree::requestReadingInOrder(size_t prefix_size, int direction, size_t limit)
|
||||||
@ -1764,11 +1758,11 @@ bool ReadFromMergeTree::requestOutputEachPartitionThroughSeparatePort()
|
|||||||
|
|
||||||
ReadFromMergeTree::AnalysisResult ReadFromMergeTree::getAnalysisResult() const
|
ReadFromMergeTree::AnalysisResult ReadFromMergeTree::getAnalysisResult() const
|
||||||
{
|
{
|
||||||
auto result_ptr = analyzed_result_ptr ? analyzed_result_ptr : selectRangesToRead(prepared_parts, alter_conversions_for_parts);
|
auto result_ptr = analyzed_result_ptr
|
||||||
if (std::holds_alternative<std::exception_ptr>(result_ptr->result))
|
? analyzed_result_ptr
|
||||||
std::rethrow_exception(std::get<std::exception_ptr>(result_ptr->result));
|
: selectRangesToRead(prepared_parts, alter_conversions_for_parts);
|
||||||
|
|
||||||
return std::get<AnalysisResult>(result_ptr->result);
|
return *result_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadFromMergeTree::isQueryWithFinal() const
|
bool ReadFromMergeTree::isQueryWithFinal() const
|
||||||
@ -2235,33 +2229,5 @@ void ReadFromMergeTree::describeIndexes(JSONBuilder::JSONMap & map) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MergeTreeDataSelectAnalysisResult::error() const
|
|
||||||
{
|
|
||||||
return std::holds_alternative<std::exception_ptr>(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t MergeTreeDataSelectAnalysisResult::marks() const
|
|
||||||
{
|
|
||||||
if (std::holds_alternative<std::exception_ptr>(result))
|
|
||||||
std::rethrow_exception(std::get<std::exception_ptr>(result));
|
|
||||||
|
|
||||||
return std::get<ReadFromMergeTree::AnalysisResult>(result).selected_marks;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt64 MergeTreeDataSelectAnalysisResult::rows() const
|
|
||||||
{
|
|
||||||
if (std::holds_alternative<std::exception_ptr>(result))
|
|
||||||
std::rethrow_exception(std::get<std::exception_ptr>(result));
|
|
||||||
|
|
||||||
return std::get<ReadFromMergeTree::AnalysisResult>(result).selected_rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
const RangesInDataParts & MergeTreeDataSelectAnalysisResult::partsWithRanges() const
|
|
||||||
{
|
|
||||||
if (std::holds_alternative<std::exception_ptr>(result))
|
|
||||||
std::rethrow_exception(std::get<std::exception_ptr>(result));
|
|
||||||
|
|
||||||
return std::get<ReadFromMergeTree::AnalysisResult>(result).parts_with_ranges;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,9 +55,6 @@ struct UsefulSkipIndexes
|
|||||||
std::vector<MergedDataSkippingIndexAndCondition> merged_indices;
|
std::vector<MergedDataSkippingIndexAndCondition> merged_indices;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MergeTreeDataSelectAnalysisResult;
|
|
||||||
using MergeTreeDataSelectAnalysisResultPtr = std::shared_ptr<MergeTreeDataSelectAnalysisResult>;
|
|
||||||
|
|
||||||
/// This step is created to read from MergeTree* table.
|
/// This step is created to read from MergeTree* table.
|
||||||
/// For now, it takes a list of parts and creates source from it.
|
/// For now, it takes a list of parts and creates source from it.
|
||||||
class ReadFromMergeTree final : public SourceStepWithFilter
|
class ReadFromMergeTree final : public SourceStepWithFilter
|
||||||
@ -108,6 +105,8 @@ public:
|
|||||||
void checkLimits(const Settings & settings, const SelectQueryInfo & query_info_) const;
|
void checkLimits(const Settings & settings, const SelectQueryInfo & query_info_) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using AnalysisResultPtr = std::shared_ptr<AnalysisResult>;
|
||||||
|
|
||||||
ReadFromMergeTree(
|
ReadFromMergeTree(
|
||||||
MergeTreeData::DataPartsVector parts_,
|
MergeTreeData::DataPartsVector parts_,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions_,
|
std::vector<AlterConversionsPtr> alter_conversions_,
|
||||||
@ -122,9 +121,8 @@ public:
|
|||||||
bool sample_factor_column_queried_,
|
bool sample_factor_column_queried_,
|
||||||
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read_,
|
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read_,
|
||||||
Poco::Logger * log_,
|
Poco::Logger * log_,
|
||||||
MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr_,
|
AnalysisResultPtr analyzed_result_ptr_,
|
||||||
bool enable_parallel_reading
|
bool enable_parallel_reading);
|
||||||
);
|
|
||||||
|
|
||||||
static constexpr auto name = "ReadFromMergeTree";
|
static constexpr auto name = "ReadFromMergeTree";
|
||||||
String getName() const override { return name; }
|
String getName() const override { return name; }
|
||||||
@ -157,7 +155,7 @@ public:
|
|||||||
std::optional<std::unordered_set<String>> part_values;
|
std::optional<std::unordered_set<String>> part_values;
|
||||||
};
|
};
|
||||||
|
|
||||||
static MergeTreeDataSelectAnalysisResultPtr selectRangesToRead(
|
static AnalysisResultPtr selectRangesToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions,
|
std::vector<AlterConversionsPtr> alter_conversions,
|
||||||
const PrewhereInfoPtr & prewhere_info,
|
const PrewhereInfoPtr & prewhere_info,
|
||||||
@ -174,7 +172,7 @@ public:
|
|||||||
Poco::Logger * log,
|
Poco::Logger * log,
|
||||||
std::optional<Indexes> & indexes);
|
std::optional<Indexes> & indexes);
|
||||||
|
|
||||||
MergeTreeDataSelectAnalysisResultPtr selectRangesToRead(
|
AnalysisResultPtr selectRangesToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions) const;
|
std::vector<AlterConversionsPtr> alter_conversions) const;
|
||||||
|
|
||||||
@ -196,7 +194,7 @@ public:
|
|||||||
bool willOutputEachPartitionThroughSeparatePort() const { return output_each_partition_through_separate_port; }
|
bool willOutputEachPartitionThroughSeparatePort() const { return output_each_partition_through_separate_port; }
|
||||||
|
|
||||||
bool hasAnalyzedResult() const { return analyzed_result_ptr != nullptr; }
|
bool hasAnalyzedResult() const { return analyzed_result_ptr != nullptr; }
|
||||||
void setAnalyzedResult(MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr_) { analyzed_result_ptr = std::move(analyzed_result_ptr_); }
|
void setAnalyzedResult(AnalysisResultPtr analyzed_result_ptr_) { analyzed_result_ptr = std::move(analyzed_result_ptr_); }
|
||||||
|
|
||||||
const MergeTreeData::DataPartsVector & getParts() const { return prepared_parts; }
|
const MergeTreeData::DataPartsVector & getParts() const { return prepared_parts; }
|
||||||
const std::vector<AlterConversionsPtr> & getAlterConvertionsForParts() const { return alter_conversions_for_parts; }
|
const std::vector<AlterConversionsPtr> & getAlterConvertionsForParts() const { return alter_conversions_for_parts; }
|
||||||
@ -209,7 +207,7 @@ public:
|
|||||||
void applyFilters() override;
|
void applyFilters() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static MergeTreeDataSelectAnalysisResultPtr selectRangesToReadImpl(
|
static AnalysisResultPtr selectRangesToReadImpl(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
std::vector<AlterConversionsPtr> alter_conversions,
|
std::vector<AlterConversionsPtr> alter_conversions,
|
||||||
const StorageMetadataPtr & metadata_snapshot_base,
|
const StorageMetadataPtr & metadata_snapshot_base,
|
||||||
@ -294,21 +292,11 @@ private:
|
|||||||
RangesInDataParts && parts, size_t num_streams, const Names & origin_column_names, const Names & column_names, ActionsDAGPtr & out_projection);
|
RangesInDataParts && parts, size_t num_streams, const Names & origin_column_names, const Names & column_names, ActionsDAGPtr & out_projection);
|
||||||
|
|
||||||
ReadFromMergeTree::AnalysisResult getAnalysisResult() const;
|
ReadFromMergeTree::AnalysisResult getAnalysisResult() const;
|
||||||
MergeTreeDataSelectAnalysisResultPtr analyzed_result_ptr;
|
AnalysisResultPtr analyzed_result_ptr;
|
||||||
|
|
||||||
bool is_parallel_reading_from_replicas;
|
bool is_parallel_reading_from_replicas;
|
||||||
std::optional<MergeTreeAllRangesCallback> all_ranges_callback;
|
std::optional<MergeTreeAllRangesCallback> all_ranges_callback;
|
||||||
std::optional<MergeTreeReadTaskCallback> read_task_callback;
|
std::optional<MergeTreeReadTaskCallback> read_task_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MergeTreeDataSelectAnalysisResult
|
|
||||||
{
|
|
||||||
std::variant<std::exception_ptr, ReadFromMergeTree::AnalysisResult> result;
|
|
||||||
|
|
||||||
bool error() const;
|
|
||||||
size_t marks() const;
|
|
||||||
UInt64 rows() const;
|
|
||||||
const RangesInDataParts & partsWithRanges() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6930,7 +6930,7 @@ UInt64 MergeTreeData::estimateNumberOfRowsToRead(
|
|||||||
query_context,
|
query_context,
|
||||||
query_context->getSettingsRef().max_threads);
|
query_context->getSettingsRef().max_threads);
|
||||||
|
|
||||||
UInt64 total_rows = result_ptr->rows();
|
UInt64 total_rows = result_ptr->selected_rows;
|
||||||
if (query_info.limit > 0 && query_info.limit < total_rows)
|
if (query_info.limit > 0 && query_info.limit < total_rows)
|
||||||
total_rows = query_info.limit;
|
total_rows = query_info.limit;
|
||||||
return total_rows;
|
return total_rows;
|
||||||
|
@ -135,9 +135,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read(
|
|||||||
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read,
|
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read,
|
||||||
bool enable_parallel_reading) const
|
bool enable_parallel_reading) const
|
||||||
{
|
{
|
||||||
if (query_info.merge_tree_empty_result)
|
|
||||||
return std::make_unique<QueryPlan>();
|
|
||||||
|
|
||||||
const auto & snapshot_data = assert_cast<const MergeTreeData::SnapshotData &>(*storage_snapshot->data);
|
const auto & snapshot_data = assert_cast<const MergeTreeData::SnapshotData &>(*storage_snapshot->data);
|
||||||
const auto & parts = snapshot_data.parts;
|
const auto & parts = snapshot_data.parts;
|
||||||
const auto & alter_conversions = snapshot_data.alter_conversions;
|
const auto & alter_conversions = snapshot_data.alter_conversions;
|
||||||
@ -933,7 +930,7 @@ static void selectColumnNames(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MergeTreeDataSelectAnalysisResultPtr MergeTreeDataSelectExecutor::estimateNumMarksToRead(
|
ReadFromMergeTree::AnalysisResultPtr MergeTreeDataSelectExecutor::estimateNumMarksToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
const PrewhereInfoPtr & prewhere_info,
|
const PrewhereInfoPtr & prewhere_info,
|
||||||
const Names & column_names_to_return,
|
const Names & column_names_to_return,
|
||||||
@ -947,8 +944,7 @@ MergeTreeDataSelectAnalysisResultPtr MergeTreeDataSelectExecutor::estimateNumMar
|
|||||||
{
|
{
|
||||||
size_t total_parts = parts.size();
|
size_t total_parts = parts.size();
|
||||||
if (total_parts == 0)
|
if (total_parts == 0)
|
||||||
return std::make_shared<MergeTreeDataSelectAnalysisResult>(
|
return std::make_shared<ReadFromMergeTree::AnalysisResult>();
|
||||||
MergeTreeDataSelectAnalysisResult{.result = ReadFromMergeTree::AnalysisResult()});
|
|
||||||
|
|
||||||
Names real_column_names;
|
Names real_column_names;
|
||||||
Names virt_column_names;
|
Names virt_column_names;
|
||||||
@ -989,13 +985,13 @@ QueryPlanStepPtr MergeTreeDataSelectExecutor::readFromParts(
|
|||||||
const UInt64 max_block_size,
|
const UInt64 max_block_size,
|
||||||
const size_t num_streams,
|
const size_t num_streams,
|
||||||
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read,
|
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read,
|
||||||
MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr,
|
ReadFromMergeTree::AnalysisResultPtr merge_tree_select_result_ptr,
|
||||||
bool enable_parallel_reading) const
|
bool enable_parallel_reading) const
|
||||||
{
|
{
|
||||||
/// If merge_tree_select_result_ptr != nullptr, we use analyzed result so parts will always be empty.
|
/// If merge_tree_select_result_ptr != nullptr, we use analyzed result so parts will always be empty.
|
||||||
if (merge_tree_select_result_ptr)
|
if (merge_tree_select_result_ptr)
|
||||||
{
|
{
|
||||||
if (merge_tree_select_result_ptr->marks() == 0)
|
if (merge_tree_select_result_ptr->selected_marks == 0)
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
else if (parts.empty())
|
else if (parts.empty())
|
||||||
|
@ -48,13 +48,13 @@ public:
|
|||||||
UInt64 max_block_size,
|
UInt64 max_block_size,
|
||||||
size_t num_streams,
|
size_t num_streams,
|
||||||
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read = nullptr,
|
std::shared_ptr<PartitionIdToMaxBlock> max_block_numbers_to_read = nullptr,
|
||||||
MergeTreeDataSelectAnalysisResultPtr merge_tree_select_result_ptr = nullptr,
|
ReadFromMergeTree::AnalysisResultPtr merge_tree_select_result_ptr = nullptr,
|
||||||
bool enable_parallel_reading = false) const;
|
bool enable_parallel_reading = false) const;
|
||||||
|
|
||||||
/// Get an estimation for the number of marks we are going to read.
|
/// Get an estimation for the number of marks we are going to read.
|
||||||
/// Reads nothing. Secondary indexes are not used.
|
/// Reads nothing. Secondary indexes are not used.
|
||||||
/// This method is used to select best projection for table.
|
/// This method is used to select best projection for table.
|
||||||
MergeTreeDataSelectAnalysisResultPtr estimateNumMarksToRead(
|
ReadFromMergeTree::AnalysisResultPtr estimateNumMarksToRead(
|
||||||
MergeTreeData::DataPartsVector parts,
|
MergeTreeData::DataPartsVector parts,
|
||||||
const PrewhereInfoPtr & prewhere_info,
|
const PrewhereInfoPtr & prewhere_info,
|
||||||
const Names & column_names,
|
const Names & column_names,
|
||||||
|
@ -37,7 +37,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Used in queries with projection.
|
/// Used in queries with projection.
|
||||||
StorageFromMergeTreeDataPart(const MergeTreeData & storage_, MergeTreeDataSelectAnalysisResultPtr analysis_result_ptr_)
|
StorageFromMergeTreeDataPart(const MergeTreeData & storage_, ReadFromMergeTree::AnalysisResultPtr analysis_result_ptr_)
|
||||||
: IStorage(storage_.getStorageID()), storage(storage_), analysis_result_ptr(analysis_result_ptr_)
|
: IStorage(storage_.getStorageID()), storage(storage_), analysis_result_ptr(analysis_result_ptr_)
|
||||||
{
|
{
|
||||||
setInMemoryMetadata(storage.getInMemoryMetadata());
|
setInMemoryMetadata(storage.getInMemoryMetadata());
|
||||||
@ -127,7 +127,7 @@ private:
|
|||||||
const std::vector<AlterConversionsPtr> alter_conversions;
|
const std::vector<AlterConversionsPtr> alter_conversions;
|
||||||
const MergeTreeData & storage;
|
const MergeTreeData & storage;
|
||||||
const String partition_id;
|
const String partition_id;
|
||||||
const MergeTreeDataSelectAnalysisResultPtr analysis_result_ptr;
|
const ReadFromMergeTree::AnalysisResultPtr analysis_result_ptr;
|
||||||
|
|
||||||
static StorageID getIDFromPart(const MergeTreeData::DataPartPtr & part_)
|
static StorageID getIDFromPart(const MergeTreeData::DataPartPtr & part_)
|
||||||
{
|
{
|
||||||
|
@ -42,9 +42,6 @@ using ReadInOrderOptimizerPtr = std::shared_ptr<const ReadInOrderOptimizer>;
|
|||||||
class Cluster;
|
class Cluster;
|
||||||
using ClusterPtr = std::shared_ptr<Cluster>;
|
using ClusterPtr = std::shared_ptr<Cluster>;
|
||||||
|
|
||||||
struct MergeTreeDataSelectAnalysisResult;
|
|
||||||
using MergeTreeDataSelectAnalysisResultPtr = std::shared_ptr<MergeTreeDataSelectAnalysisResult>;
|
|
||||||
|
|
||||||
struct PrewhereInfo
|
struct PrewhereInfo
|
||||||
{
|
{
|
||||||
/// Actions for row level security filter. Applied separately before prewhere_actions.
|
/// Actions for row level security filter. Applied separately before prewhere_actions.
|
||||||
@ -214,7 +211,6 @@ struct SelectQueryInfo
|
|||||||
|
|
||||||
ClusterPtr getCluster() const { return !optimized_cluster ? cluster : optimized_cluster; }
|
ClusterPtr getCluster() const { return !optimized_cluster ? cluster : optimized_cluster; }
|
||||||
|
|
||||||
bool merge_tree_empty_result = false;
|
|
||||||
bool settings_limit_offset_done = false;
|
bool settings_limit_offset_done = false;
|
||||||
bool is_internal = false;
|
bool is_internal = false;
|
||||||
bool parallel_replicas_disabled = false;
|
bool parallel_replicas_disabled = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user