Repository navigation
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Describe the bug
Given the following input plan (I see this by enabling trace logging via RUST_LOG=trace:
SortExec: [tag@2 ASC NULLS LAST]
ProjectionExec: expr=[bar@0 as bar, foo@1 as foo, tag@2 as tag, time@3 as time]
DeduplicateExec: [tag@2 ASC,time@3 ASC]
SortPreservingMergeExec: [tag@2 ASC,time@3 ASC]
UnionExec
ParquetExec: limit=None, partitions={1 group: [[d.parquet]]}, output_ordering=[tag@2 ASC, time@3 ASC], projection=[bar, foo, tag, time]
SortExec: [tag@2 ASC,time@3 ASC]
RecordBatchesExec: batches_groups=1 batches=1
Here is the input to enforce sorting:
Optimized physical plan by EnforceDistribution:
SortExec: [tag@2 ASC NULLS LAST]
CoalescePartitionsExec
ProjectionExec: expr=[bar@0 as bar, foo@1 as foo, tag@2 as tag, time@3 as time]
RepartitionExec: partitioning=RoundRobinBatch(4)
DeduplicateExec: [tag@2 ASC,time@3 ASC]
SortPreservingMergeExec: [tag@2 ASC,time@3 ASC]
UnionExec <-- ** Note that the ParquetExec is already sorted correctly!
ParquetExec: limit=None, partitions={1 group: [[d.parquet]]}, output_ordering=[tag@2 ASC, time@3 ASC], projection=[bar, foo, tag, time]
SortExec: [tag@2 ASC,time@3 ASC]
RecordBatchesExec: batches_groups=1 batches=1
And here is the output from EnforceSorting, where it has moved the SortExec up to the top of the union:
Optimized physical plan by EnforceSorting:
SortExec: [tag@2 ASC NULLS LAST]
CoalescePartitionsExec
ProjectionExec: expr=[bar@0 as bar, foo@1 as foo, tag@2 as tag, time@3 as time]
RepartitionExec: partitioning=RoundRobinBatch(4)
DeduplicateExec: [tag@2 ASC,time@3 ASC]
SortPreservingMergeExec: [tag@2 ASC,time@3 ASC]
SortExec: [tag@2 ASC,time@3 ASC] <-- ** SortExec is moved to the output of Union, *resorting* the parquet file
UnionExec
ParquetExec: limit=None, partitions={1 group: [[1/1/1/1/57d6a92a-314a-4a32-a633-33bc3e1fe7a3.parquet]]}, output_ordering=[tag@2 ASC, time@3 ASC], projection=[bar, foo, tag, time]
RecordBatchesExec: batches_groups=1 batches=1
To Reproduce
I have a reproducer from IOx -- see https://github.com/influxdata/influxdb_iox/pull/6528#discussion_r1070632410
Expected behavior
I expect the SortExec to be left where it is (at the input to the
Additional context
I found this in the context of upgrading DataFusion in IOx: https://github.com/influxdata/influxdb_iox/pull/6528
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
alamb commentedon Jan 17, 2023
cc @mustafasrepo and @mingmwang who I think have expertise in this area
mustafasrepo commentedon Jan 17, 2023
I think the reason is that UnionExec doesn't implement
fn maintains_input_order(&self) -> bool. But sometimes it maintains_input_order. If we implementfn maintains_input_order(&self) -> boolas below (Taken fromself.output_orderingimplementation). I think the problem will be solved.alamb commentedon Jan 17, 2023
Thank you @mustafasrepo -- I will attempt to write a reproducer for this and try our your proposed fix
alamb commentedon Jan 17, 2023
proposed PR: #4946
mingmwang commentedon Jan 18, 2023
Nice !!
alamb commentedon Jan 18, 2023
Yes I am quite pleased with how sophisticated the sorting based optimizations are becoming