mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge pull request #40305 from ClickHouse/sort_mode_rename
Sorting mode renaming
This commit is contained in:
commit
025c7a1ae0
@ -108,7 +108,7 @@ void DistinctStep::transformPipeline(QueryPipelineBuilder & pipeline, const Buil
|
||||
return;
|
||||
}
|
||||
/// final distinct for sorted stream (sorting inside and among chunks)
|
||||
if (input_stream.sort_mode == DataStream::SortMode::Stream)
|
||||
if (input_stream.sort_scope == DataStream::SortScope::Global)
|
||||
{
|
||||
assert(input_stream.has_single_port);
|
||||
|
||||
|
@ -31,18 +31,18 @@ public:
|
||||
/// QueryPipeline has single port. Totals or extremes ports are not counted.
|
||||
bool has_single_port = false;
|
||||
|
||||
/// How data is sorted.
|
||||
enum class SortMode
|
||||
/// Sorting scope
|
||||
enum class SortScope
|
||||
{
|
||||
None,
|
||||
Chunk, /// Separate chunks are sorted
|
||||
Port, /// Data from each port is sorted
|
||||
Stream, /// Data is globally sorted
|
||||
Stream, /// Each data steam is sorted
|
||||
Global, /// Data is globally sorted
|
||||
};
|
||||
|
||||
/// It is not guaranteed that header has columns from sort_description.
|
||||
SortDescription sort_description = {};
|
||||
SortMode sort_mode = SortMode::None;
|
||||
SortScope sort_scope = SortScope::None;
|
||||
|
||||
/// Things which may be added:
|
||||
/// * limit
|
||||
@ -54,7 +54,7 @@ public:
|
||||
return distinct_columns == other.distinct_columns
|
||||
&& has_single_port == other.has_single_port
|
||||
&& sort_description == other.sort_description
|
||||
&& (sort_description.empty() || sort_mode == other.sort_mode);
|
||||
&& (sort_description.empty() || sort_scope == other.sort_scope);
|
||||
}
|
||||
|
||||
bool hasEqualHeaderWith(const DataStream & other) const
|
||||
|
@ -29,7 +29,7 @@ DataStream ITransformingStep::createOutputStream(
|
||||
if (stream_traits.preserves_sorting)
|
||||
{
|
||||
output_stream.sort_description = input_stream.sort_description;
|
||||
output_stream.sort_mode = input_stream.sort_mode;
|
||||
output_stream.sort_scope = input_stream.sort_scope;
|
||||
}
|
||||
|
||||
return output_stream;
|
||||
|
@ -333,8 +333,8 @@ static void explainStep(
|
||||
{
|
||||
if (step.hasOutputStream())
|
||||
{
|
||||
settings.out << prefix << "Sorting (" << step.getOutputStream().sort_mode << ")";
|
||||
if (step.getOutputStream().sort_mode != DataStream::SortMode::None)
|
||||
settings.out << prefix << "Sorting (" << step.getOutputStream().sort_scope << ")";
|
||||
if (step.getOutputStream().sort_scope != DataStream::SortScope::None)
|
||||
{
|
||||
settings.out << ": ";
|
||||
dumpSortDescription(step.getOutputStream().sort_description, settings.out);
|
||||
|
@ -143,9 +143,9 @@ ReadFromMergeTree::ReadFromMergeTree(
|
||||
{
|
||||
auto const & settings = context->getSettingsRef();
|
||||
if ((settings.optimize_read_in_order || settings.optimize_aggregation_in_order) && query_info.getInputOrderInfo())
|
||||
output_stream->sort_mode = DataStream::SortMode::Port;
|
||||
output_stream->sort_scope = DataStream::SortScope::Stream;
|
||||
else
|
||||
output_stream->sort_mode = DataStream::SortMode::Chunk;
|
||||
output_stream->sort_scope = DataStream::SortScope::Chunk;
|
||||
}
|
||||
|
||||
output_stream->sort_description = std::move(sort_description);
|
||||
|
@ -55,7 +55,7 @@ SortingStep::SortingStep(
|
||||
{
|
||||
/// TODO: check input_stream is partially sorted by the same description.
|
||||
output_stream->sort_description = result_description;
|
||||
output_stream->sort_mode = DataStream::SortMode::Stream;
|
||||
output_stream->sort_scope = DataStream::SortScope::Global;
|
||||
}
|
||||
|
||||
SortingStep::SortingStep(
|
||||
@ -73,7 +73,7 @@ SortingStep::SortingStep(
|
||||
{
|
||||
/// TODO: check input_stream is sorted by prefix_description.
|
||||
output_stream->sort_description = result_description;
|
||||
output_stream->sort_mode = DataStream::SortMode::Stream;
|
||||
output_stream->sort_scope = DataStream::SortScope::Global;
|
||||
}
|
||||
|
||||
SortingStep::SortingStep(
|
||||
@ -89,14 +89,14 @@ SortingStep::SortingStep(
|
||||
{
|
||||
/// TODO: check input_stream is partially sorted (each port) by the same description.
|
||||
output_stream->sort_description = result_description;
|
||||
output_stream->sort_mode = DataStream::SortMode::Stream;
|
||||
output_stream->sort_scope = DataStream::SortScope::Global;
|
||||
}
|
||||
|
||||
void SortingStep::updateOutputStream()
|
||||
{
|
||||
output_stream = createOutputStream(input_streams.front(), input_streams.front().header, getDataStreamTraits());
|
||||
output_stream->sort_description = result_description;
|
||||
output_stream->sort_mode = DataStream::SortMode::Stream;
|
||||
output_stream->sort_scope = DataStream::SortScope::Global;
|
||||
}
|
||||
|
||||
void SortingStep::updateLimit(size_t limit_)
|
||||
@ -256,23 +256,23 @@ void SortingStep::transformPipeline(QueryPipelineBuilder & pipeline, const Build
|
||||
return;
|
||||
}
|
||||
|
||||
const auto input_sort_mode = input_streams.front().sort_mode;
|
||||
const auto input_sort_mode = input_streams.front().sort_scope;
|
||||
const SortDescription & input_sort_desc = input_streams.front().sort_description;
|
||||
if (optimize_sorting_by_input_stream_properties)
|
||||
{
|
||||
/// skip sorting if stream is already sorted
|
||||
if (input_sort_mode == DataStream::SortMode::Stream && input_sort_desc.hasPrefix(result_description))
|
||||
if (input_sort_mode == DataStream::SortScope::Global && input_sort_desc.hasPrefix(result_description))
|
||||
return;
|
||||
|
||||
/// merge sorted
|
||||
if (input_sort_mode == DataStream::SortMode::Port && input_sort_desc.hasPrefix(result_description))
|
||||
if (input_sort_mode == DataStream::SortScope::Stream && input_sort_desc.hasPrefix(result_description))
|
||||
{
|
||||
mergingSorted(pipeline, result_description, limit);
|
||||
return;
|
||||
}
|
||||
|
||||
/// if chunks already sorted according to result_sort_desc, then we can skip chunk sorting
|
||||
if (input_sort_mode == DataStream::SortMode::Chunk && input_sort_desc.hasPrefix(result_description))
|
||||
if (input_sort_mode == DataStream::SortScope::Chunk && input_sort_desc.hasPrefix(result_description))
|
||||
{
|
||||
const bool skip_partial_sort = true;
|
||||
fullSort(pipeline, result_description, limit, skip_partial_sort);
|
||||
|
@ -1,8 +1,8 @@
|
||||
-- EXPLAIN PLAN sorting for MergeTree w/o sorting key
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a FROM optimize_sorting ORDER BY a
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Global): a ASC
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Global): a ASC
|
||||
Sorting (None)
|
||||
Sorting (None)
|
||||
-- disable optimization -> sorting order is NOT propagated from subquery -> full sort
|
||||
@ -20,22 +20,22 @@ LimitsCheckingTransform
|
||||
PartialSortingTransform
|
||||
-- ExpressionStep preserves sort mode
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a FROM optimize_sorting ORDER BY a
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Global): a ASC
|
||||
Sorting
|
||||
Sorting (Global): a ASC
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Port): a ASC
|
||||
Sorting (Port): a ASC
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a FROM optimize_sorting ORDER BY a+1
|
||||
Sorting (None)
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): plus(a, 1) ASC
|
||||
Sorting (Global): plus(a, 1) ASC
|
||||
Sorting (Chunk): a ASC
|
||||
Sorting (Chunk): a ASC
|
||||
-- ExpressionStep breaks sort mode
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a+1 FROM optimize_sorting ORDER BY a+1
|
||||
Sorting (Stream): plus(a, 1) ASC
|
||||
Sorting (Global): plus(a, 1) ASC
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): plus(a, 1) ASC
|
||||
Sorting (Global): plus(a, 1) ASC
|
||||
Sorting (None)
|
||||
Sorting (Chunk): a ASC
|
||||
-- FilterStep preserves sort mode
|
||||
@ -62,28 +62,28 @@ Sorting (None)
|
||||
Sorting (Chunk): a ASC
|
||||
-- aliases break sorting order
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a FROM (SELECT sipHash64(a) AS a FROM (SELECT a FROM optimize_sorting ORDER BY a)) ORDER BY a
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Global): a ASC
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Global): a ASC
|
||||
Sorting (None)
|
||||
Sorting
|
||||
Sorting (Global): a ASC
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Stream): a ASC
|
||||
Sorting (Port): a ASC
|
||||
Sorting (Port): a ASC
|
||||
-- aliases DONT break sorting order
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a, b FROM (SELECT x AS a, y AS b FROM (SELECT a AS x, b AS y FROM optimize_sorting) ORDER BY x, y)
|
||||
Sorting (Stream): x ASC, y ASC
|
||||
Sorting (Global): x ASC, y ASC
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): x ASC, y ASC
|
||||
Sorting (Global): x ASC, y ASC
|
||||
Sorting (Chunk): a ASC, b ASC
|
||||
Sorting (Chunk): a ASC, b ASC
|
||||
-- actions chain breaks sorting order: input(column a)->sipHash64(column a)->alias(sipHash64(column a), a)->plus(alias a, 1)
|
||||
-- QUERY: set optimize_read_in_order=1;EXPLAIN PLAN actions=1, header=1, sorting=1 SELECT a, z FROM (SELECT sipHash64(a) AS a, a + 1 AS z FROM (SELECT a FROM optimize_sorting ORDER BY a + 1)) ORDER BY a + 1
|
||||
Sorting (None)
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): plus(a, 1) ASC
|
||||
Sorting (Global): plus(a, 1) ASC
|
||||
Sorting (None)
|
||||
Sorting (Sorting for ORDER BY)
|
||||
Sorting (Stream): plus(a, 1) ASC
|
||||
Sorting (Global): plus(a, 1) ASC
|
||||
Sorting (Chunk): a ASC
|
||||
Sorting (Chunk): a ASC
|
||||
|
Loading…
Reference in New Issue
Block a user