From d3a79e8d45054b59d3cc597d0fce2d777d7b6ec6 Mon Sep 17 00:00:00 2001 From: Lukasz Stec Date: Thu, 24 Feb 2022 10:29:53 +0100 Subject: [PATCH 1/5] Revert "Modularize PagePartitioner" This reverts commit 6058b291 --- .../io/trino/operator/OperatorFactories.java | 13 ------ .../operator/TrinoOperatorFactories.java | 25 ----------- .../output/DefaultPagePartitioner.java | 7 --- .../operator/output/PagePartitioner.java | 34 --------------- .../output/PagePartitionerFactory.java | 41 ------------------ .../output/PartitionedOutputOperator.java | 43 +++---------------- .../sql/planner/LocalExecutionPlanner.java | 4 +- .../BenchmarkPartitionedOutputOperator.java | 42 ++++-------------- .../output/TestPartitionedOutputOperator.java | 38 +++------------- 9 files changed, 23 insertions(+), 224 deletions(-) delete mode 100644 core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java delete mode 100644 core/trino-main/src/main/java/io/trino/operator/output/PagePartitionerFactory.java diff --git a/core/trino-main/src/main/java/io/trino/operator/OperatorFactories.java b/core/trino-main/src/main/java/io/trino/operator/OperatorFactories.java index 1e5baa0ba3ce..c9c8503ed1d0 100644 --- a/core/trino-main/src/main/java/io/trino/operator/OperatorFactories.java +++ b/core/trino-main/src/main/java/io/trino/operator/OperatorFactories.java @@ -13,11 +13,8 @@ */ package io.trino.operator; -import io.airlift.units.DataSize; -import io.trino.execution.buffer.OutputBuffer; import io.trino.operator.join.JoinBridgeManager; import io.trino.operator.join.LookupSourceFactory; -import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.Type; import io.trino.spiller.PartitioningSpillerFactory; import io.trino.sql.planner.plan.PlanNodeId; @@ -84,14 +81,4 @@ OperatorFactory fullOuterJoin( OptionalInt totalOperatorsCount, PartitioningSpillerFactory partitioningSpillerFactory, BlockTypeOperators blockTypeOperators); - - OutputFactory partitionedOutput( - TaskContext taskContext, - PartitionFunction partitionFunction, - List partitionChannels, - List> partitionConstants, - boolean replicateNullsAndAny, - OptionalInt nullChannel, - OutputBuffer outputBuffer, - DataSize maxPagePartitioningBufferSize); } diff --git a/core/trino-main/src/main/java/io/trino/operator/TrinoOperatorFactories.java b/core/trino-main/src/main/java/io/trino/operator/TrinoOperatorFactories.java index 1c0410a89f43..37269f681eb7 100644 --- a/core/trino-main/src/main/java/io/trino/operator/TrinoOperatorFactories.java +++ b/core/trino-main/src/main/java/io/trino/operator/TrinoOperatorFactories.java @@ -13,14 +13,11 @@ */ package io.trino.operator; -import io.airlift.units.DataSize; -import io.trino.execution.buffer.OutputBuffer; import io.trino.operator.join.JoinBridgeManager; import io.trino.operator.join.JoinProbe.JoinProbeFactory; import io.trino.operator.join.LookupJoinOperatorFactory; import io.trino.operator.join.LookupJoinOperatorFactory.JoinType; import io.trino.operator.join.LookupSourceFactory; -import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.Type; import io.trino.spiller.PartitioningSpillerFactory; import io.trino.sql.planner.plan.PlanNodeId; @@ -36,7 +33,6 @@ import static io.trino.operator.join.LookupJoinOperatorFactory.JoinType.INNER; import static io.trino.operator.join.LookupJoinOperatorFactory.JoinType.LOOKUP_OUTER; import static io.trino.operator.join.LookupJoinOperatorFactory.JoinType.PROBE_OUTER; -import static io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputFactory; public class TrinoOperatorFactories implements OperatorFactories @@ -165,27 +161,6 @@ public OperatorFactory fullOuterJoin( blockTypeOperators); } - @Override - public OutputFactory partitionedOutput( - TaskContext taskContext, - PartitionFunction partitionFunction, - List partitionChannels, - List> partitionConstants, - boolean replicateNullsAndAny, - OptionalInt nullChannel, - OutputBuffer outputBuffer, - DataSize maxPagePartitioningBufferSize) - { - return new PartitionedOutputFactory( - partitionFunction, - partitionChannels, - partitionConstants, - replicateNullsAndAny, - nullChannel, - outputBuffer, - maxPagePartitioningBufferSize); - } - private static List rangeList(int endExclusive) { return IntStream.range(0, endExclusive) diff --git a/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java b/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java index 465c15e932dc..864942859790 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java @@ -50,7 +50,6 @@ import static java.util.Objects.requireNonNull; public class DefaultPagePartitioner - implements PagePartitioner { private final OutputBuffer outputBuffer; private final Type[] sourceTypes; @@ -115,13 +114,11 @@ public DefaultPagePartitioner( } } - @Override public ListenableFuture isFull() { return outputBuffer.isFull(); } - @Override public long getSizeInBytes() { // We use a foreach loop instead of streams @@ -136,7 +133,6 @@ public long getSizeInBytes() /** * This method can be expensive for complex types. */ - @Override public long getRetainedSizeInBytes() { long sizeInBytes = 0; @@ -146,7 +142,6 @@ public long getRetainedSizeInBytes() return sizeInBytes; } - @Override public Supplier getOperatorInfoSupplier() { return createPartitionedOutputOperatorInfoSupplier(rowsAdded, pagesAdded, outputBuffer); @@ -161,7 +156,6 @@ private static Supplier createPartitionedOutputOperatorIn return () -> new PartitionedOutputInfo(rowsAdded.get(), pagesAdded.get(), outputBuffer.getPeakMemoryUsage()); } - @Override public void partitionPage(Page page) { requireNonNull(page, "page is null"); @@ -238,7 +232,6 @@ private void appendRow(PageBuilder pageBuilder, Page page, int position) } } - @Override public void flush(boolean force) { try (PagesSerde.PagesSerdeContext context = serde.newContext()) { diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java deleted file mode 100644 index 9311d40dce22..000000000000 --- a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.trino.operator.output; - -import com.google.common.util.concurrent.ListenableFuture; -import io.trino.spi.Page; - -import java.util.function.Supplier; - -public interface PagePartitioner -{ - void partitionPage(Page page); - - void flush(boolean force); - - ListenableFuture isFull(); - - long getSizeInBytes(); - - long getRetainedSizeInBytes(); - - Supplier getOperatorInfoSupplier(); -} diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitionerFactory.java b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitionerFactory.java deleted file mode 100644 index ed4036d92578..000000000000 --- a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitionerFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.trino.operator.output; - -import io.airlift.units.DataSize; -import io.trino.execution.buffer.OutputBuffer; -import io.trino.execution.buffer.PagesSerdeFactory; -import io.trino.operator.OperatorContext; -import io.trino.operator.PartitionFunction; -import io.trino.spi.predicate.NullableValue; -import io.trino.spi.type.Type; - -import java.util.List; -import java.util.Optional; -import java.util.OptionalInt; - -public interface PagePartitionerFactory -{ - PagePartitioner create( - PartitionFunction partitionFunction, - List partitionChannels, - List> partitionConstants, - boolean replicatesAnyRow, - OptionalInt nullChannel, - OutputBuffer outputBuffer, - PagesSerdeFactory serdeFactory, - List sourceTypes, - DataSize maxMemory, - OperatorContext operatorContext); -} diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java index 43f5d4ddc649..5a06bb3a6283 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java @@ -54,7 +54,6 @@ public static class PartitionedOutputFactory private final boolean replicatesAnyRow; private final OptionalInt nullChannel; private final DataSize maxMemory; - private final PagePartitionerFactory pagePartitionerFactory; public PartitionedOutputFactory( PartitionFunction partitionFunction, @@ -64,26 +63,6 @@ public PartitionedOutputFactory( OptionalInt nullChannel, OutputBuffer outputBuffer, DataSize maxMemory) - { - this(partitionFunction, - partitionChannels, - partitionConstants, - replicatesAnyRow, - nullChannel, - outputBuffer, - maxMemory, - DefaultPagePartitioner::new); - } - - public PartitionedOutputFactory( - PartitionFunction partitionFunction, - List partitionChannels, - List> partitionConstants, - boolean replicatesAnyRow, - OptionalInt nullChannel, - OutputBuffer outputBuffer, - DataSize maxMemory, - PagePartitionerFactory pagePartitionerFactory) { this.partitionFunction = requireNonNull(partitionFunction, "partitionFunction is null"); this.partitionChannels = requireNonNull(partitionChannels, "partitionChannels is null"); @@ -92,7 +71,6 @@ public PartitionedOutputFactory( this.nullChannel = requireNonNull(nullChannel, "nullChannel is null"); this.outputBuffer = requireNonNull(outputBuffer, "outputBuffer is null"); this.maxMemory = requireNonNull(maxMemory, "maxMemory is null"); - this.pagePartitionerFactory = requireNonNull(pagePartitionerFactory, "pagePartitionerFactory is null"); } @Override @@ -115,8 +93,7 @@ public OperatorFactory createOutputOperator( nullChannel, outputBuffer, serdeFactory, - maxMemory, - pagePartitionerFactory); + maxMemory); } } @@ -135,7 +112,6 @@ public static class PartitionedOutputOperatorFactory private final OutputBuffer outputBuffer; private final PagesSerdeFactory serdeFactory; private final DataSize maxMemory; - private final PagePartitionerFactory pagePartitionerFactory; public PartitionedOutputOperatorFactory( int operatorId, @@ -149,8 +125,7 @@ public PartitionedOutputOperatorFactory( OptionalInt nullChannel, OutputBuffer outputBuffer, PagesSerdeFactory serdeFactory, - DataSize maxMemory, - PagePartitionerFactory pagePartitionerFactory) + DataSize maxMemory) { this.operatorId = operatorId; this.planNodeId = requireNonNull(planNodeId, "planNodeId is null"); @@ -164,7 +139,6 @@ public PartitionedOutputOperatorFactory( this.outputBuffer = requireNonNull(outputBuffer, "outputBuffer is null"); this.serdeFactory = requireNonNull(serdeFactory, "serdeFactory is null"); this.maxMemory = requireNonNull(maxMemory, "maxMemory is null"); - this.pagePartitionerFactory = requireNonNull(pagePartitionerFactory, "pagePartitionerFactory is null"); } @Override @@ -182,8 +156,7 @@ public Operator createOperator(DriverContext driverContext) nullChannel, outputBuffer, serdeFactory, - maxMemory, - pagePartitionerFactory); + maxMemory); } @Override @@ -206,14 +179,13 @@ public OperatorFactory duplicate() nullChannel, outputBuffer, serdeFactory, - maxMemory, - pagePartitionerFactory); + maxMemory); } } private final OperatorContext operatorContext; private final Function pagePreprocessor; - private final PagePartitioner partitionFunction; + private final DefaultPagePartitioner partitionFunction; private final LocalMemoryContext memoryContext; private final long partitionsInitialRetainedSize; private ListenableFuture isBlocked = NOT_BLOCKED; @@ -230,12 +202,11 @@ public PartitionedOutputOperator( OptionalInt nullChannel, OutputBuffer outputBuffer, PagesSerdeFactory serdeFactory, - DataSize maxMemory, - PagePartitionerFactory pagePartitionerFactory) + DataSize maxMemory) { this.operatorContext = requireNonNull(operatorContext, "operatorContext is null"); this.pagePreprocessor = requireNonNull(pagePreprocessor, "pagePreprocessor is null"); - this.partitionFunction = pagePartitionerFactory.create( + this.partitionFunction = new DefaultPagePartitioner( partitionFunction, partitionChannels, partitionConstants, diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java index 9ffb9754f566..fe8f54e49213 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java @@ -122,6 +122,7 @@ import io.trino.operator.join.NestedLoopJoinBridge; import io.trino.operator.join.NestedLoopJoinPagesSupplier; import io.trino.operator.join.PartitionedLookupSourceFactory; +import io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputFactory; import io.trino.operator.output.TaskOutputOperator.TaskOutputFactory; import io.trino.operator.project.CursorProcessor; import io.trino.operator.project.PageProcessor; @@ -515,8 +516,7 @@ public LocalExecutionPlan plan( outputLayout, types, partitionedSourceOrder, - operatorFactories.partitionedOutput( - taskContext, + new PartitionedOutputFactory( partitionFunction, partitionChannels, partitionConstants, diff --git a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java index d8385509eae2..b53afd4887a7 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.airlift.units.DataSize; -import io.trino.Session; import io.trino.execution.StageId; import io.trino.execution.TaskId; import io.trino.execution.buffer.OutputBufferStateMachine; @@ -28,12 +27,9 @@ import io.trino.memory.context.SimpleLocalMemoryContext; import io.trino.operator.BucketPartitionFunction; import io.trino.operator.DriverContext; -import io.trino.operator.OperatorFactories; -import io.trino.operator.OutputFactory; import io.trino.operator.PartitionFunction; import io.trino.operator.PrecomputedHashGenerator; -import io.trino.operator.TaskContext; -import io.trino.operator.TrinoOperatorFactories; +import io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputFactory; import io.trino.spi.Page; import io.trino.spi.QueryId; import io.trino.spi.block.Block; @@ -82,6 +78,7 @@ import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static io.airlift.units.DataSize.Unit.BYTE; import static io.airlift.units.DataSize.Unit.MEGABYTE; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.block.BlockAssertions.createLongDictionaryBlock; import static io.trino.block.BlockAssertions.createLongsBlock; import static io.trino.block.BlockAssertions.createRLEBlock; @@ -97,7 +94,6 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DecimalType.createDecimalType; import static io.trino.spi.type.Decimals.MAX_SHORT_PRECISION; -import static io.trino.testing.TestingSession.testSessionBuilder; import static java.util.Collections.nCopies; import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; @@ -113,8 +109,6 @@ @BenchmarkMode(Mode.AverageTime) public class BenchmarkPartitionedOutputOperator { - private static final OperatorFactories OPERATOR_FACTORIES = new TrinoOperatorFactories(); - @Benchmark public void addPage(BenchmarkData data) { @@ -142,9 +136,6 @@ public static class BenchmarkData private static final ExecutorService EXECUTOR = newCachedThreadPool(daemonThreadsNamed("BenchmarkPartitionedOutputOperator-executor-%s")); private static final ScheduledExecutorService SCHEDULER = newScheduledThreadPool(1, daemonThreadsNamed("BenchmarkPartitionedOutputOperator-scheduledExecutor-%s")); - private final OperatorFactories operatorFactories; - private final Session session; - @Param({"2", "16", "256"}) private int partitionCount = 256; @@ -350,17 +341,6 @@ public List getTypes(int channelCount) } } - public BenchmarkData() - { - this(OPERATOR_FACTORIES, testSessionBuilder().build()); - } - - protected BenchmarkData(OperatorFactories operatorFactories, Session session) - { - this.operatorFactories = requireNonNull(operatorFactories, "operatorFactories is null"); - this.session = requireNonNull(session, "session is null"); - } - public int getPageCount() { return pageCount; @@ -429,34 +409,28 @@ private PartitionedOutputOperator createPartitionedOutputOperator() PagesSerdeFactory serdeFactory = new PagesSerdeFactory(new TestingBlockEncodingSerde(), enableCompression); PartitionedOutputBuffer buffer = createPartitionedOutputBuffer(); - TaskContext taskContext = createTaskContext(); - OutputFactory operatorFactory = operatorFactories.partitionedOutput( - taskContext, + PartitionedOutputFactory operatorFactory = new PartitionedOutputFactory( partitionFunction, ImmutableList.of(types.size() - 1), // hash block is at the last channel ImmutableList.of(Optional.empty()), false, - nullChannel, + OptionalInt.empty(), buffer, MAX_PARTITION_BUFFER_SIZE); return (PartitionedOutputOperator) operatorFactory .createOutputOperator(0, new PlanNodeId("plan-node-0"), types, Function.identity(), serdeFactory) - .createOperator(createDriverContext(taskContext)); + .createOperator(createDriverContext()); } - private DriverContext createDriverContext(TaskContext taskContext) + private DriverContext createDriverContext() { - return taskContext + return TestingTaskContext.builder(EXECUTOR, SCHEDULER, TEST_SESSION) + .build() .addPipelineContext(0, true, true, false) .addDriverContext(); } - private TaskContext createTaskContext() - { - return TestingTaskContext.builder(EXECUTOR, SCHEDULER, session).build(); - } - private TestingPartitionedOutputBuffer createPartitionedBuffer(OutputBuffers buffers, DataSize dataSize) { return new TestingPartitionedOutputBuffer( diff --git a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java index 0e66e10aebf7..01691c3de0e0 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java @@ -19,7 +19,6 @@ import com.google.common.util.concurrent.ListenableFuture; import io.airlift.slice.Slice; import io.airlift.units.DataSize; -import io.trino.Session; import io.trino.execution.StateMachine; import io.trino.execution.buffer.BufferResult; import io.trino.execution.buffer.BufferState; @@ -31,11 +30,8 @@ import io.trino.operator.BucketPartitionFunction; import io.trino.operator.DriverContext; import io.trino.operator.OperatorContext; -import io.trino.operator.OperatorFactories; import io.trino.operator.OutputFactory; import io.trino.operator.PartitionFunction; -import io.trino.operator.TaskContext; -import io.trino.operator.TrinoOperatorFactories; import io.trino.spi.Page; import io.trino.spi.block.Block; import io.trino.spi.block.DictionaryBlock; @@ -67,6 +63,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static io.airlift.units.DataSize.Unit.MEGABYTE; +import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.block.BlockAssertions.createLongDictionaryBlock; import static io.trino.block.BlockAssertions.createLongSequenceBlock; import static io.trino.block.BlockAssertions.createLongsBlock; @@ -85,7 +82,6 @@ import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.sql.planner.SystemPartitioningHandle.SystemPartitionFunction.ROUND_ROBIN; -import static io.trino.testing.TestingSession.testSessionBuilder; import static java.lang.Math.toIntExact; import static java.util.Collections.nCopies; import static java.util.Collections.unmodifiableList; @@ -98,8 +94,6 @@ @Test(singleThreaded = true) public class TestPartitionedOutputOperator { - private static final OperatorFactories TRINO_OPERATOR_FACTORIES = new TrinoOperatorFactories(); - private static final Session TEST_SESSION = testSessionBuilder().build(); private static final DataSize MAX_MEMORY = DataSize.of(50, MEGABYTE); private static final DataSize PARTITION_MAX_MEMORY = DataSize.of(5, MEGABYTE); @@ -109,24 +103,10 @@ public class TestPartitionedOutputOperator private static final PagesSerdeFactory PAGES_SERDE_FACTORY = new PagesSerdeFactory(new TestingBlockEncodingSerde(), false); private static final PagesSerde PAGES_SERDE = PAGES_SERDE_FACTORY.createPagesSerde(); - private final Session testSession; - private final OperatorFactories operatorFactories; - private ExecutorService executor; private ScheduledExecutorService scheduledExecutor; private TestOutputBuffer outputBuffer; - public TestPartitionedOutputOperator() - { - this(TEST_SESSION, TRINO_OPERATOR_FACTORIES); - } - - protected TestPartitionedOutputOperator(Session testSession, OperatorFactories operatorFactories) - { - this.testSession = testSession; - this.operatorFactories = operatorFactories; - } - @BeforeClass public void setUpClass() { @@ -444,13 +424,11 @@ private PartitionedOutputOperatorBuilder partitionedOutputOperator(List ty private PartitionedOutputOperatorBuilder partitionedOutputOperator() { - return new PartitionedOutputOperatorBuilder(operatorFactories, testSession, executor, scheduledExecutor, outputBuffer); + return new PartitionedOutputOperatorBuilder(executor, scheduledExecutor, outputBuffer); } static class PartitionedOutputOperatorBuilder { - private final OperatorFactories operatorFactories; - private final Session testSession; private final ExecutorService executor; private final ScheduledExecutorService scheduledExecutor; private final OutputBuffer outputBuffer; @@ -462,10 +440,8 @@ static class PartitionedOutputOperatorBuilder private OptionalInt nullChannel = OptionalInt.empty(); private List types; - PartitionedOutputOperatorBuilder(OperatorFactories operatorFactories, Session testSession, ExecutorService executor, ScheduledExecutorService scheduledExecutor, OutputBuffer outputBuffer) + PartitionedOutputOperatorBuilder(ExecutorService executor, ScheduledExecutorService scheduledExecutor, OutputBuffer outputBuffer) { - this.operatorFactories = requireNonNull(operatorFactories, "operatorFactories is null"); - this.testSession = requireNonNull(testSession, "testSession is null"); this.executor = requireNonNull(executor, "executor is null"); this.scheduledExecutor = requireNonNull(scheduledExecutor, "scheduledExecutor is null"); this.outputBuffer = requireNonNull(outputBuffer, "outputBuffer is null"); @@ -529,10 +505,9 @@ public PartitionedOutputOperatorBuilder withTypes(List types) public PartitionedOutputOperator build() { - TaskContext taskContext = TestingTaskContext.builder(executor, scheduledExecutor, testSession) + DriverContext driverContext = TestingTaskContext.builder(executor, scheduledExecutor, TEST_SESSION) .setMemoryPoolSize(MAX_MEMORY) - .build(); - DriverContext driverContext = taskContext + .build() .addPipelineContext(0, true, true, false) .addDriverContext(); @@ -541,8 +516,7 @@ public PartitionedOutputOperator build() buffers = buffers.withBuffer(new OutputBuffers.OutputBufferId(partition), partition); } - OutputFactory operatorFactory = operatorFactories.partitionedOutput( - taskContext, + OutputFactory operatorFactory = new PartitionedOutputOperator.PartitionedOutputFactory( partitionFunction, partitionChannels, partitionConstants, From f5b483a208ffc4729f28789dc2e045a91699e5d6 Mon Sep 17 00:00:00 2001 From: Lukasz Stec Date: Tue, 22 Feb 2022 11:44:28 +0100 Subject: [PATCH 2/5] Pollute jit profile in the benchmark setup Static pollution can fail if a code path is chosen based on the benchmark parameters since it only pollutes one code path and not necessarily the one under test --- .../output/BenchmarkPartitionedOutputOperator.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java index b53afd4887a7..53f606ac699d 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java @@ -363,6 +363,12 @@ public Page getDataPage() @Setup public void setup(Blackhole blackhole) + { + setupData(blackhole); + pollute(); + } + + private void setupData(Blackhole blackhole) { // We don't check blackhole is not null, because blackhole has to be injected by jmh (should not be created manually) // and in case of unit test it will be null @@ -493,7 +499,8 @@ private static MapType createMapType(Type keyType, Type valueType) new TypeOperators()); } - static { + private static void pollute() + { try { List types = List.of( TestType.BIGINT, @@ -510,7 +517,7 @@ private static MapType createMapType(Type keyType, Type valueType) types.forEach(type -> { BenchmarkData data = new BenchmarkData(); data.setType(type); - data.setup(null); + data.setupData(null); data.setPageCount(1); benchmark.addPage(data); }); From 755cbf48980a2dd61754042201a38f16a09ac432 Mon Sep 17 00:00:00 2001 From: Lukasz Stec Date: Thu, 24 Feb 2022 12:56:46 +0100 Subject: [PATCH 3/5] Rename DefaultPagePartitioner to PagePartitioner --- .../{DefaultPagePartitioner.java => PagePartitioner.java} | 4 ++-- .../io/trino/operator/output/PartitionedOutputOperator.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename core/trino-main/src/main/java/io/trino/operator/output/{DefaultPagePartitioner.java => PagePartitioner.java} (99%) diff --git a/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java similarity index 99% rename from core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java rename to core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java index 864942859790..897495ddb0aa 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/DefaultPagePartitioner.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java @@ -49,7 +49,7 @@ import static java.lang.Math.toIntExact; import static java.util.Objects.requireNonNull; -public class DefaultPagePartitioner +public class PagePartitioner { private final OutputBuffer outputBuffer; private final Type[] sourceTypes; @@ -66,7 +66,7 @@ public class DefaultPagePartitioner private boolean hasAnyRowBeenReplicated; private final OperatorContext operatorContext; - public DefaultPagePartitioner( + public PagePartitioner( PartitionFunction partitionFunction, List partitionChannels, List> partitionConstants, diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java index 5a06bb3a6283..ee6dd54fc2f2 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java @@ -185,7 +185,7 @@ public OperatorFactory duplicate() private final OperatorContext operatorContext; private final Function pagePreprocessor; - private final DefaultPagePartitioner partitionFunction; + private final PagePartitioner partitionFunction; private final LocalMemoryContext memoryContext; private final long partitionsInitialRetainedSize; private ListenableFuture isBlocked = NOT_BLOCKED; @@ -206,7 +206,7 @@ public PartitionedOutputOperator( { this.operatorContext = requireNonNull(operatorContext, "operatorContext is null"); this.pagePreprocessor = requireNonNull(pagePreprocessor, "pagePreprocessor is null"); - this.partitionFunction = new DefaultPagePartitioner( + this.partitionFunction = new PagePartitioner( partitionFunction, partitionChannels, partitionConstants, From 6fa20a219c3a342f0ac6eb9c9e390ce84c907a0f Mon Sep 17 00:00:00 2001 From: Lukasz Stec Date: Thu, 17 Feb 2022 17:00:45 +0100 Subject: [PATCH 4/5] Implement column-wise approach in the PagePartitioner Column-wise approach works in two stages. First it divides the input positions to output partitions. Then, for each partition and column, all values in the give column for the selected positions for the given partition are copied to the output buffer. Benchmark channelCount enableCompression nullRate partitionCount positionCount type baseline columnar columnar % BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT 1302.926 769.102 -40.97116797 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_SKEWED_HASH 1936.168 1118.931 -42.20899219 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 DICTIONARY_BIGINT 1206.206 650.893 -46.03799019 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 RLE_BIGINT 952.319 479.22 -49.67862659 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 888.163 560.123 -36.93466177 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1114.431 498.424 -55.27547242 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1128.77 546.881 -51.55071449 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1328.122 766.677 -42.27360137 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1406.781 947 -32.6831966 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 RLE_PARTITION_BIGINT 1780.045 572.681 -67.82772346 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 RLE_PARTITION_NULL_BIGINT 6.281 2.675 -57.41124025 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 LONG_DECIMAL 2524.384 1786.068 -29.24737282 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 INTEGER 1357.94 770.557 -43.25544575 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 SMALLINT 1376.242 776.705 -43.56334133 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 BOOLEAN 1273.884 705.885 -44.58796876 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 VARCHAR 3407.343 3008.769 -11.69750154 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 ARRAY_BIGINT 599.536 472.668 -21.1610312 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 ARRAY_VARCHAR 1637.497 1534.025 -6.31891234 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 ARRAY_ARRAY_BIGINT 1958.92 1740.14 -11.16839891 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 MAP_BIGINT_BIGINT 2623.346 1863.795 -28.95351967 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 5665.363 5628.05 -0.6586162264 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 ROW_BIGINT_BIGINT 710.468 503.575 -29.12066413 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1617.816 1462.798 -9.581930207 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT 1444.293 831.347 -42.43917266 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_SKEWED_HASH 1478.507 1129.366 -23.61442996 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 DICTIONARY_BIGINT 1058.473 598.475 -43.45864278 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 RLE_BIGINT 987.504 529.149 -46.41550819 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 785.252 583.389 -25.70677948 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1092.184 523.947 -52.02758876 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1111.695 566.813 -49.01362334 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1342.185 845.712 -36.98990825 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1439.271 929.554 -35.4149427 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 RLE_PARTITION_BIGINT 1752.947 586.828 -66.52334611 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 RLE_PARTITION_NULL_BIGINT 6.81 2.701 -60.33773862 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 LONG_DECIMAL 1829.298 1233.125 -32.5902614 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 INTEGER 1443.725 741.839 -48.61632236 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 SMALLINT 1295.63 872.862 -32.6303034 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 BOOLEAN 1187.705 788.527 -33.60918747 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 VARCHAR 3491.593 2954.383 -15.38581387 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 ARRAY_BIGINT 752.269 458.261 -39.08282808 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 ARRAY_VARCHAR 1970.084 1583.343 -19.6306858 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 ARRAY_ARRAY_BIGINT 2062.881 1718.861 -16.67667694 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 MAP_BIGINT_BIGINT 2325.006 1616.14 -30.48878153 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 7450.894 6816.993 -8.507717329 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 ROW_BIGINT_BIGINT 710.563 641.962 -9.6544571 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1666.879 1349.303 -19.05213276 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT 2127.969 1162.371 -45.37650689 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_SKEWED_HASH 1744.494 1225.401 -29.75607827 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 DICTIONARY_BIGINT 1165.121 795.747 -31.70263003 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 RLE_BIGINT 1003.777 542.223 -45.98172702 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 911.041 620.684 -31.87090372 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1067.159 509.559 -52.25088295 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1128.943 586.323 -48.06442841 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1339.027 841.835 -37.13084202 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1104.041 1006.807 -8.807100461 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 RLE_PARTITION_BIGINT 1731.372 609.43 -64.80074762 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 RLE_PARTITION_NULL_BIGINT 7.116 3.624 -49.07251265 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 LONG_DECIMAL 2633.272 1375.594 -47.76103646 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 INTEGER 2009.192 1045.348 -47.97172197 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 SMALLINT 1933.012 959.111 -50.38256358 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 BOOLEAN 1207.247 753.839 -37.55718589 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 VARCHAR 5700.359 3255.2 -42.89482469 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 ARRAY_BIGINT 938.458 766.523 -18.3210117 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 ARRAY_VARCHAR 2368.788 1904.359 -19.60618679 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 ARRAY_ARRAY_BIGINT 2781.737 2155.849 -22.49989844 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 MAP_BIGINT_BIGINT 2349.572 1943.247 -17.29357517 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 7496.46 6325.078 -15.62580205 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 ROW_BIGINT_BIGINT 1160.061 836.216 -27.91620441 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 2697.067 1822.442 -32.42874574 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT 1646.478 1270.516 -22.83431664 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_SKEWED_HASH 1919.47 1646.059 -14.24408821 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 DICTIONARY_BIGINT 1226.175 919.27 -25.02946154 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 RLE_BIGINT 993.583 546.51 -44.99603959 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 942.063 765.762 -18.7143535 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1079.083 692.897 -35.78834992 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1095.834 698.804 -36.23085248 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1326.996 981.428 -26.04137465 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1387.114 1199.907 -13.496151 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 RLE_PARTITION_BIGINT 1875.813 916.654 -51.13297541 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 RLE_PARTITION_NULL_BIGINT 6.857 3.915 -42.90506052 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 LONG_DECIMAL 2050.416 1582.807 -22.80556726 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 INTEGER 1530.588 1162.388 -24.05611438 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 SMALLINT 1516.703 1013.684 -33.1652934 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 BOOLEAN 1631.464 1240.743 -23.94910338 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 VARCHAR 3604.938 3643.791 1.077771657 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 ARRAY_BIGINT 808.011 725.302 -10.23612302 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 ARRAY_VARCHAR 1650.827 1505.909 -8.778509196 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 ARRAY_ARRAY_BIGINT 2142.252 2048.516 -4.375582331 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 MAP_BIGINT_BIGINT 1785.228 1689.082 -5.385642618 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 4851.934 4461.389 -8.049264479 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 ROW_BIGINT_BIGINT 837.225 661.3 -21.0128699 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1852.099 1772.665 -4.288863608 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT 1515.336 1041.617 -31.26164758 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_SKEWED_HASH 1907.812 1727.84 -9.433424258 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 DICTIONARY_BIGINT 1043.224 656.817 -37.03969617 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 RLE_BIGINT 1012.265 597.133 -41.01020978 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 948.128 790.254 -16.65112727 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1098.098 687.351 -37.40531355 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1093.862 746.08 -31.79395573 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1336.2 1016.64 -23.9155815 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1377.588 1192.294 -13.45061078 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 RLE_PARTITION_BIGINT 1861.171 916.732 -50.74434321 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 RLE_PARTITION_NULL_BIGINT 6.917 4.044 -41.53534769 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 LONG_DECIMAL 1806.737 1178.898 -34.74988335 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 INTEGER 1492.28 1012.088 -32.17841156 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 SMALLINT 1441.843 888.18 -38.3996732 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 BOOLEAN 1382.287 831.613 -39.83789184 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 VARCHAR 3161.59 2949.017 -6.723610588 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 ARRAY_BIGINT 709.124 577.973 -18.49479076 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 ARRAY_VARCHAR 1519.582 1438.652 -5.325806702 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 ARRAY_ARRAY_BIGINT 2131.942 2087.158 -2.100619998 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 MAP_BIGINT_BIGINT 1551.028 1293.686 -16.59170563 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 4609.262 4658.954 1.078090158 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 ROW_BIGINT_BIGINT 783.013 599.198 -23.4753446 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1696.338 1674.645 -1.278813538 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT 2017.965 1251.385 -37.98777481 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_SKEWED_HASH 1970.866 1815.443 -7.886025737 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 DICTIONARY_BIGINT 1328.739 851.467 -35.91916847 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 RLE_BIGINT 997.416 626.612 -37.17646398 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 936.802 773.944 -17.38446331 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1100.638 724.973 -34.13156733 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1097.292 770.055 -29.8222351 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1350.826 1051.77 -22.13875066 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1390.028 1218.119 -12.36730483 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 RLE_PARTITION_BIGINT 1901.381 980.588 -48.42759026 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 RLE_PARTITION_NULL_BIGINT 7.888 5.282 -33.03752535 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 LONG_DECIMAL 2578.739 1464.405 -43.21236077 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 INTEGER 2020.733 1298.996 -35.71659393 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 SMALLINT 1917.248 1129.529 -41.08592107 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 BOOLEAN 1376.727 976.403 -29.07795082 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 VARCHAR 5123.119 3301.373 -35.55931455 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 ARRAY_BIGINT 937.792 835.528 -10.90476353 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 ARRAY_VARCHAR 2061.161 1894.317 -8.094661213 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 ARRAY_ARRAY_BIGINT 2522.042 2269.116 -10.02861967 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 MAP_BIGINT_BIGINT 2142.333 1694.135 -20.92102395 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 5453.217 5341.727 -2.044481267 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 ROW_BIGINT_BIGINT 1102.601 808.415 -26.68109316 BenchmarkPartitionedOutputOperator.addPage 1 TRUE 0.2 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 2345.838 1876.885 -19.99085188 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT 1328.014 782.884 -41.04851304 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_SKEWED_HASH 1341.07 951.721 -29.03271268 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 DICTIONARY_BIGINT 998.892 565.345 -43.40279029 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 RLE_BIGINT 989.367 549.45 -44.46449093 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 818.097 566.987 -30.69440421 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1021.362 458.36 -55.12266953 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1021.036 521.528 -48.92168347 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1032.333 569.624 -44.8216806 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1016.136 637.31 -37.28103325 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 RLE_PARTITION_BIGINT 1677.801 580.697 -65.38939958 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 RLE_PARTITION_NULL_BIGINT 6.148 2.601 -57.69355888 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 LONG_DECIMAL 1609.268 1069.346 -33.55078209 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 INTEGER 1326.069 879.578 -33.67026904 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 SMALLINT 1302.886 849.126 -34.82729878 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 BOOLEAN 1300.278 801.554 -38.35518251 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 VARCHAR 2818.775 2802.964 -0.5609174198 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 ARRAY_BIGINT 556.795 493.318 -11.40042565 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 ARRAY_VARCHAR 1463.227 1289.521 -11.87143212 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 ARRAY_ARRAY_BIGINT 1934.333 1855.516 -4.074634512 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 MAP_BIGINT_BIGINT 1459.303 1071.631 -26.56555904 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 4571.217 4710.173 3.039803186 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 ROW_BIGINT_BIGINT 639.188 507.635 -20.58126873 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1479.139 1363.726 -7.802714958 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT 1436.78 898.92 -37.43509793 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_SKEWED_HASH 1334.748 1014.379 -24.00220866 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 DICTIONARY_BIGINT 1065.134 622.869 -41.52200568 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 RLE_BIGINT 1010.447 562.927 -44.28930958 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 799.241 627.254 -21.51879095 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1039.015 458.651 -55.85713392 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1042.339 551.893 -47.05244647 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1030.947 606.992 -41.12287053 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1028.115 667.305 -35.09432311 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 RLE_PARTITION_BIGINT 1634.18 591.4 -63.81059614 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 RLE_PARTITION_NULL_BIGINT 6.011 2.579 -57.09532524 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 LONG_DECIMAL 1751.223 1306.027 -25.42200508 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 INTEGER 1428.153 938.248 -34.30339747 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 SMALLINT 1425.804 932.788 -34.5781047 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 BOOLEAN 1276.056 897.798 -29.64274295 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 VARCHAR 3239.605 3084.066 -4.801171748 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 ARRAY_BIGINT 587.28 525.919 -10.4483381 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 ARRAY_VARCHAR 1594.76 1464.104 -8.192831523 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 ARRAY_ARRAY_BIGINT 2004.263 1892.049 -5.59876623 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 MAP_BIGINT_BIGINT 1596.031 1391.183 -12.83483842 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 5044.242 4569.822 -9.405179212 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 ROW_BIGINT_BIGINT 732.507 537.054 -26.68274842 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1519.684 1454.59 -4.283390494 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT 2142.286 1153.369 -46.16176365 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_SKEWED_HASH 1356.356 1017.215 -25.0038338 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 DICTIONARY_BIGINT 1424.596 850.085 -40.32799474 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 RLE_BIGINT 996.244 631.306 -36.63138749 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 820.281 635.856 -22.48314907 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1052.514 516.466 -50.93024891 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1105.52 580.888 -47.45567697 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1041.5 621.096 -40.36524244 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1037.605 704.192 -32.13294076 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 RLE_PARTITION_BIGINT 1711.72 622.791 -63.61607039 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 RLE_PARTITION_NULL_BIGINT 6.876 3.74 -45.60791158 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 LONG_DECIMAL 2703.82 1629.277 -39.7416618 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 INTEGER 2097.015 1232.037 -41.24805974 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 SMALLINT 1970.243 1202.984 -38.94235381 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 BOOLEAN 1300.563 955.816 -26.5075202 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 VARCHAR 5433.172 3729.668 -31.35376535 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 ARRAY_BIGINT 962.135 780.835 -18.84350949 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 ARRAY_VARCHAR 2287.687 2069.558 -9.534914523 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 ARRAY_ARRAY_BIGINT 2740.952 2093.304 -23.62857868 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 MAP_BIGINT_BIGINT 2376.493 1755.927 -26.11267948 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 7145.292 6860.392 -3.987240829 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 ROW_BIGINT_BIGINT 1148.814 737.52 -35.80161802 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 2438.02 1730.604 -29.01600479 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT 1542.505 1141.967 -25.96672296 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_SKEWED_HASH 1528.385 1200.545 -21.45009274 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 DICTIONARY_BIGINT 1050.792 758.367 -27.82900898 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 RLE_BIGINT 985.578 547.333 -44.46578556 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 877.957 675.363 -23.0756176 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1074.513 589.388 -45.14836023 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1044.045 631.848 -39.48076951 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1040.564 627.667 -39.68011578 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1029.127 779.784 -24.22859375 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 RLE_PARTITION_BIGINT 1850.428 867.953 -53.09447328 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 RLE_PARTITION_NULL_BIGINT 6.78 3.874 -42.86135693 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 LONG_DECIMAL 1681.209 1185.421 -29.48996823 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 INTEGER 1486.483 1035.678 -30.32695295 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 SMALLINT 1393.511 953.533 -31.57334244 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 BOOLEAN 1445.677 991.316 -31.42894298 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 VARCHAR 2870.282 2633.568 -8.247064226 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 ARRAY_BIGINT 703.224 558.767 -20.54210323 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 ARRAY_VARCHAR 1255.166 1174.679 -6.412458591 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 ARRAY_ARRAY_BIGINT 2006.519 1945.431 -3.044476529 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 MAP_BIGINT_BIGINT 1439.195 1309.613 -9.003783365 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 3808.236 3492.41 -8.293236028 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 ROW_BIGINT_BIGINT 741.837 564.075 -23.96240684 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1549.318 1512.847 -2.354003503 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT 1466.336 979.943 -33.17063756 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_SKEWED_HASH 1574.268 1373.047 -12.78187704 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 DICTIONARY_BIGINT 1023.141 655.652 -35.91772786 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 RLE_BIGINT 980.678 568.113 -42.06936426 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 882.148 728.543 -17.41261104 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1034.492 650.021 -37.16519799 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1027.63 622.823 -39.392291 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1019.902 658.343 -35.4503668 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1039.249 796.849 -23.32453531 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 RLE_PARTITION_BIGINT 1838.673 900.44 -51.02772489 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 RLE_PARTITION_NULL_BIGINT 6.892 3.91 -43.26755659 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 LONG_DECIMAL 1768.704 1141.687 -35.45064635 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 INTEGER 1478.627 889.719 -39.82802965 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 SMALLINT 1431.79 858.757 -40.02214012 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 BOOLEAN 1347.694 940.269 -30.23126912 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 VARCHAR 2971.862 2761.666 -7.072872159 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 ARRAY_BIGINT 725.752 694.491 -4.307394261 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 ARRAY_VARCHAR 1340 1199.433 -10.49007463 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 ARRAY_ARRAY_BIGINT 1997.005 1884.82 -5.61766245 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 MAP_BIGINT_BIGINT 1496.776 1322.185 -11.66447084 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 4043.786 3725.813 -7.863249935 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 ROW_BIGINT_BIGINT 794.52 576.589 -27.42926547 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 1608.529 1471.911 -8.493350135 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT 1983.131 1426.8 -28.05316442 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_SKEWED_HASH 1688.429 1351.925 -19.93000594 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 DICTIONARY_BIGINT 1344.609 848.275 -36.91288694 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 RLE_BIGINT 989.584 617.285 -37.62176834 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 873.076 756.496 -13.35278945 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1047.469 679.288 -35.14958438 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1056.427 675.651 -36.04375882 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1041.838 681.072 -34.62784041 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1033.718 816.641 -20.99963433 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 RLE_PARTITION_BIGINT 1850.437 933.937 -49.52884103 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 RLE_PARTITION_NULL_BIGINT 7.586 5.209 -31.33403638 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 LONG_DECIMAL 2475.471 1443.022 -41.70717411 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 INTEGER 2011.162 1267.454 -36.97902009 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 SMALLINT 1908.761 1130.535 -40.77126471 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 BOOLEAN 1361.54 870.647 -36.0542474 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 VARCHAR 4839.889 3281.086 -32.20741219 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 ARRAY_BIGINT 893.161 808.889 -9.435252995 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 ARRAY_VARCHAR 1912.328 1659.965 -13.19663782 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 ARRAY_ARRAY_BIGINT 2296.046 2055.136 -10.49238561 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 MAP_BIGINT_BIGINT 2138.706 1742.191 -18.53994892 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 5432.889 5140.89 -5.374654259 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 ROW_BIGINT_BIGINT 1082.421 771.412 -28.73272045 BenchmarkPartitionedOutputOperator.addPage 1 FALSE 0.2 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 2214.725 1695.168 -23.45921051 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT 1863.551 1148.084 -38.39267077 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_SKEWED_HASH 2207.817 1657.039 -24.94672339 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 DICTIONARY_BIGINT 1656.253 1055.973 -36.24325511 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 RLE_BIGINT 1363.576 688.575 -49.50226463 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1228.092 873.406 -28.88106103 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1510.711 762.043 -49.55732764 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1534.493 836.388 -45.49417951 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1702.515 1143.947 -32.80840404 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1800.282 1265.429 -29.70940108 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 RLE_PARTITION_BIGINT 2364.895 899.545 -61.96258185 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 RLE_PARTITION_NULL_BIGINT 10.29 3.816 -62.9154519 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 LONG_DECIMAL 4256.45 3758.952 -11.68809689 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 INTEGER 1786.379 1131.209 -36.67586777 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 SMALLINT 1961.655 1113.842 -43.21927148 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 BOOLEAN 1723.534 995.049 -42.26693526 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 VARCHAR 6947.303 6214.733 -10.54466748 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 ARRAY_BIGINT 1032.977 978.331 -5.290146828 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 ARRAY_VARCHAR 3319.275 3043.291 -8.31458677 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 ARRAY_ARRAY_BIGINT 4007.356 3653.61 -8.827416381 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 MAP_BIGINT_BIGINT 3452.737 3560.543 3.122334542 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 11520.933 11599.765 0.6842501384 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 ROW_BIGINT_BIGINT 1131.367 1024.381 -9.45634794 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3361.872 2708.01 -19.44934251 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT 2029.292 1300.127 -35.93199007 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_SKEWED_HASH 2229.439 1514.66 -32.06093551 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 DICTIONARY_BIGINT 1548.21 879.077 -43.21978285 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 RLE_BIGINT 1347.258 741.15 -44.98826505 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1266.302 890.737 -29.65840692 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1519.514 787.816 -48.15342274 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1583.208 869.901 -45.05453484 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1702.761 1149.379 -32.49909999 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1788.277 1317.585 -26.32097824 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 RLE_PARTITION_BIGINT 2383.934 1007.899 -57.72118691 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 RLE_PARTITION_NULL_BIGINT 8.474 3.914 -53.81165919 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 LONG_DECIMAL 2582.467 1945.5 -24.66505864 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 INTEGER 1930.602 1167.063 -39.54927012 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 SMALLINT 1964.057 1166.88 -40.58828232 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 BOOLEAN 1710.449 1107.672 -35.24086366 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 VARCHAR 6951.744 5737.327 -17.46924225 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 ARRAY_BIGINT 1584.935 792.682 -49.98646632 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 ARRAY_VARCHAR 3400.526 3122.428 -8.178087743 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 ARRAY_ARRAY_BIGINT 3977.859 3871.471 -2.674504049 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 MAP_BIGINT_BIGINT 3416.368 3007.709 -11.96179686 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 12101.568 12336.407 1.94056671 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 ROW_BIGINT_BIGINT 1167.105 961.313 -17.63268943 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3696.905 3036.086 -17.87492511 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT 3356.454 1654.233 -50.71486158 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_SKEWED_HASH 2325.239 1682.344 -27.6485557 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 DICTIONARY_BIGINT 2346.952 1181.381 -49.66318016 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 RLE_BIGINT 1346.87 776.393 -42.35575817 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1222.365 937.465 -23.30727729 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1537.557 749.789 -51.23504364 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1579.6 839.971 -46.82381616 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1773.056 1174.826 -33.74005108 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1813.264 1352.696 -25.39994176 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 RLE_PARTITION_BIGINT 2415.479 1038.98 -56.98658527 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 RLE_PARTITION_NULL_BIGINT 9.574 5.204 -45.64445373 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 LONG_DECIMAL 4517.214 2324.894 -48.53256897 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 INTEGER 3139.564 1539.959 -50.94990897 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 SMALLINT 3094.451 1366.597 -55.83717435 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 BOOLEAN 1716.71 1055.458 -38.51856167 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 VARCHAR 10705.525 6495.568 -39.32508681 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 ARRAY_BIGINT 1704.004 1389.828 -18.4375154 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 ARRAY_VARCHAR 4994.287 4197.568 -15.95260745 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 ARRAY_ARRAY_BIGINT 4725.504 4328.849 -8.393919463 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 MAP_BIGINT_BIGINT 4606.289 3991.436 -13.34812036 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 15136.29 14127.481 -6.664836628 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 ROW_BIGINT_BIGINT 2119.629 1332.534 -37.13362103 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 4993.776 3591.435 -28.0817762 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT 2621.977 2180.791 -16.82646339 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_SKEWED_HASH 2833.757 2406.509 -15.07708671 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 DICTIONARY_BIGINT 1908.848 1495.323 -21.66358977 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 RLE_BIGINT 1373.405 687.241 -49.96079088 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1528.907 1278.892 -16.35253158 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1857.598 1168.968 -37.07099168 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1859.535 1231.557 -33.77070074 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 2107.522 1581.627 -24.95323892 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 2141.509 1678.833 -21.60513918 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 RLE_PARTITION_BIGINT 2986.759 1697.733 -43.15801844 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 RLE_PARTITION_NULL_BIGINT 10.687 6.572 -38.50472537 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 LONG_DECIMAL 3704.18 3255.385 -12.11590689 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 INTEGER 2252.082 1668.707 -25.90380812 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 SMALLINT 2196.014 1620.066 -26.22697305 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 BOOLEAN 2269.21 1728.969 -23.80744841 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 VARCHAR 6452.753 6317.546 -2.095338222 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 ARRAY_BIGINT 1533.58 1254.355 -18.20739707 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 ARRAY_VARCHAR 2991.038 2704.146 -9.591720333 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 ARRAY_ARRAY_BIGINT 4268.808 3749.68 -12.16095922 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 MAP_BIGINT_BIGINT 3536.68 3234.025 -8.557602045 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 9650.767 8993.088 -6.814784773 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 ROW_BIGINT_BIGINT 1520.686 1310.138 -13.84559337 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3684.76 3284.749 -10.85582236 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT 2347.055 1545.051 -34.17065216 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_SKEWED_HASH 2869.927 2248.489 -21.65344275 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 DICTIONARY_BIGINT 1626.832 1020.741 -37.25590596 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 RLE_BIGINT 1379.959 666.247 -51.71979747 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1543.19 1200.776 -22.18871299 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1847.985 1059.159 -42.68573609 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1891.059 1164.796 -38.40509471 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 2102.236 1444.431 -31.29073044 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 2119.657 1521.786 -28.20602579 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 RLE_PARTITION_BIGINT 2892.784 1519.324 -47.47883008 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 RLE_PARTITION_NULL_BIGINT 10.584 5.977 -43.52796674 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 LONG_DECIMAL 2956.07 2033.117 -31.22229852 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 INTEGER 2179.73 1324.936 -39.21559092 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 SMALLINT 2170.838 1313.906 -39.47470977 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 BOOLEAN 1996.539 1258.53 -36.96441692 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 VARCHAR 6602.189 5568.112 -15.66263856 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 ARRAY_BIGINT 1404.037 1395.953 -0.5757683024 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 ARRAY_VARCHAR 3181.429 2837.252 -10.81831466 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 ARRAY_ARRAY_BIGINT 4531.893 3843.637 -15.18694285 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 MAP_BIGINT_BIGINT 3177.582 2998.263 -5.643253266 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 10161.177 10032.469 -1.266664285 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 ROW_BIGINT_BIGINT 1435.117 1222.056 -14.84624599 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3769.371 3160.605 -16.15033384 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT 3603.348 1869.297 -48.12332864 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_SKEWED_HASH 2924.296 2298.626 -21.39557692 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 DICTIONARY_BIGINT 2460.315 1305.858 -46.92313789 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 RLE_BIGINT 1417.95 693.506 -51.09094115 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1624.301 1171.77 -27.86004564 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1898.433 1064.76 -43.9137436 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1976.506 1188.553 -39.86595538 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 2162.189 1474.857 -31.78871042 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 2216.69 1603.843 -27.64694206 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 RLE_PARTITION_BIGINT 3002.727 1558.729 -48.08955326 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 RLE_PARTITION_NULL_BIGINT 11.857 7.009 -40.88723961 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 LONG_DECIMAL 4677.723 2320.731 -50.38759242 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 INTEGER 3445.302 1717.331 -50.15441317 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 SMALLINT 3362.97 1654.417 -50.80488378 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 BOOLEAN 2117.017 1274.301 -39.80676584 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 VARCHAR 10106.621 5992.898 -40.7032479 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 ARRAY_BIGINT 1952.088 1578.714 -19.12690411 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 ARRAY_VARCHAR 4552.44 3531.057 -22.43594644 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 ARRAY_ARRAY_BIGINT 5689.664 4087.047 -28.16716418 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 MAP_BIGINT_BIGINT 4602.194 3313.204 -28.00816306 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 12380.703 10727.556 -13.35261011 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 ROW_BIGINT_BIGINT 2142.785 1714.245 -19.99920664 BenchmarkPartitionedOutputOperator.addPage 2 TRUE 0.2 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 4918.781 3438.696 -30.0904838 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT 1878.825 1008.841 -46.30468511 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_SKEWED_HASH 1836.541 1063.404 -42.09745385 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 DICTIONARY_BIGINT 1430.465 659.956 -53.86423296 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 RLE_BIGINT 1421.343 622.172 -56.22647032 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1091.402 593.307 -45.63808752 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1363.086 540.865 -60.32055204 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1361.662 551.261 -59.51557729 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1397.036 658.675 -52.85196659 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1468.358 702.096 -52.18495762 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 RLE_PARTITION_BIGINT 2345.955 760.505 -67.58228525 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 RLE_PARTITION_NULL_BIGINT 8.621 3.102 -64.01809535 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 LONG_DECIMAL 2422.679 1446.245 -40.30389499 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 INTEGER 2011.761 970.725 -51.74749883 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 SMALLINT 1999.281 861.114 -56.92881591 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 BOOLEAN 1850.035 857.463 -53.65152551 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 VARCHAR 6990.921 4335.687 -37.98117587 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 ARRAY_BIGINT 1168.087 719.947 -38.365293 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 ARRAY_VARCHAR 3350.386 2723.425 -18.71309754 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 ARRAY_ARRAY_BIGINT 4663.131 3118.03 -33.13441119 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 MAP_BIGINT_BIGINT 3291.085 2539.565 -22.83502249 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 14236.893 8998.296 -36.79592872 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 ROW_BIGINT_BIGINT 1181.43 811.117 -31.34447238 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3950.073 2373.669 -39.90822448 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT 2150.564 1118.559 -47.98764417 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_SKEWED_HASH 1945.991 1136.624 -41.59150787 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 DICTIONARY_BIGINT 1723.68 780.191 -54.73690012 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 RLE_BIGINT 1407.246 661.208 -53.01404303 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1162.055 629.438 -45.83406121 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1628.712 557.997 -65.7399835 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1446.426 609.922 -57.83247812 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1496.395 669.772 -55.24096245 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1418.307 735.122 -48.16904944 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 RLE_PARTITION_BIGINT 2426.715 766.76 -68.40337658 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 RLE_PARTITION_NULL_BIGINT 8.617 3.252 -62.26064756 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 LONG_DECIMAL 2721.521 1715.607 -36.96146383 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 INTEGER 2238.343 1026.796 -54.12695909 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 SMALLINT 2092.595 994.14 -52.49247943 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 BOOLEAN 1818.597 934.485 -48.61505875 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 VARCHAR 7605.351 5089.667 -33.07781587 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 ARRAY_BIGINT 1165.279 799.529 -31.38733299 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 ARRAY_VARCHAR 3547.839 2940.002 -17.13259818 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 ARRAY_ARRAY_BIGINT 4429.31 3318.057 -25.08862554 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 MAP_BIGINT_BIGINT 3581.367 3198.026 -10.703762 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 11994.207 10292.802 -14.18522292 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 ROW_BIGINT_BIGINT 2064.782 1177.686 -42.96317965 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3507.124 2438.934 -30.45771977 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT 3916.095 1551.476 -60.38206428 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_SKEWED_HASH 2019.142 1144.791 -43.30309607 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 DICTIONARY_BIGINT 2680.411 1114.69 -58.41346719 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 RLE_BIGINT 1379.229 695.817 -49.55029223 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1140.387 703.085 -38.34680683 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1439.395 584.237 -59.41093307 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1438.996 636.148 -55.79223292 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1368.816 681.185 -50.23545897 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1457.118 762.63 -47.66175423 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 RLE_PARTITION_BIGINT 2233.499 818.766 -63.34155511 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 RLE_PARTITION_NULL_BIGINT 9.421 4.392 -53.38074514 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 LONG_DECIMAL 5056.676 2179.436 -56.89982906 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 INTEGER 3331.506 1437.124 -56.86263209 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 SMALLINT 3228.211 1406.998 -56.41555028 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 BOOLEAN 1775.18 1009.466 -43.1344427 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 VARCHAR 11558.11 6073.433 -47.4530611 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 ARRAY_BIGINT 1869.353 1261.031 -32.54184737 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 ARRAY_VARCHAR 4920.551 3796.778 -22.83835692 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 ARRAY_ARRAY_BIGINT 5458.743 3809.807 -30.20724735 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 MAP_BIGINT_BIGINT 5180.376 3906.193 -24.59634204 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 15128.268 12163.868 -19.595105 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 ROW_BIGINT_BIGINT 2327.68 1541.453 -33.77728038 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0 256 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 5908.734 3192.326 -45.97275829 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT 2937.459 1745.822 -40.56693217 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_SKEWED_HASH 2629.7 1751.494 -33.39567251 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 DICTIONARY_BIGINT 1796.716 1089.904 -39.33910535 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 RLE_BIGINT 1466.173 619.295 -57.76112369 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1518.803 1079.47 -28.92626628 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1986.096 997.628 -49.76939685 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1885.521 1004.151 -46.74410945 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1743.514 1072.907 -38.4629547 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1818.783 1141.428 -37.24221086 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 RLE_PARTITION_BIGINT 3231.044 1373.811 -57.48089472 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 RLE_PARTITION_NULL_BIGINT 10.881 5.841 -46.31927213 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 LONG_DECIMAL 2931.693 1639.732 -44.06876846 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 INTEGER 2143.389 1391.832 -35.06395713 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 SMALLINT 2123.12 1315.507 -38.03897095 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 BOOLEAN 2061.169 1294.812 -37.18069697 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 VARCHAR 5414.481 4272.542 -21.09046093 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 ARRAY_BIGINT 1273.496 1133.558 -10.98849152 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 ARRAY_VARCHAR 2690.236 2224.602 -17.30829563 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 ARRAY_ARRAY_BIGINT 3720.987 3347.694 -10.03209632 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 MAP_BIGINT_BIGINT 2916.766 2711.923 -7.02294939 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 7850.97 7624.172 -2.888789538 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 ROW_BIGINT_BIGINT 1380.1 1190.544 -13.73494674 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 2 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3251.848 2613.361 -19.63458932 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT 2412.525 1518.832 -37.04388556 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_SKEWED_HASH 2408.481 1763.378 -26.78464144 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 DICTIONARY_BIGINT 1688.07 1004.218 -40.51087929 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 RLE_BIGINT 1461.4 659.568 -54.86738744 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1431.44 1083.295 -24.3213128 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1807.114 975.661 -46.00999162 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1781.458 986.743 -44.61036971 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1791.681 1090.49 -39.13592877 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1779.834 1188.946 -33.19905115 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 RLE_PARTITION_BIGINT 3038.465 1336.414 -56.01680454 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 RLE_PARTITION_NULL_BIGINT 10.647 5.696 -46.50136189 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 LONG_DECIMAL 2808.941 1922.446 -31.55975864 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 INTEGER 2176.804 1310.813 -39.7826814 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 SMALLINT 2276.514 1328.399 -41.64766832 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 BOOLEAN 1998.342 1150.102 -42.44718872 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 VARCHAR 5974.73 4668.431 -21.86373275 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 ARRAY_BIGINT 1339.121 1349.789 0.7966419763 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 ARRAY_VARCHAR 2801.763 2333.093 -16.72768182 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 ARRAY_ARRAY_BIGINT 4045.864 3361.116 -16.92464205 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 MAP_BIGINT_BIGINT 3120.186 3201.132 2.594268419 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 9464.825 8042.458 -15.02792709 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 ROW_BIGINT_BIGINT 1415.148 1150.543 -18.6980443 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 16 8192 ROW_ARRAY_BIGINT_ARRAY_BIGINT 3622.822 2647.574 -26.91956712 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT 4055.148 1917.593 -52.71213282 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_SKEWED_HASH 2617.151 1751.685 -33.06901283 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 DICTIONARY_BIGINT 2709.687 1319.012 -51.3223483 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 RLE_BIGINT 1482.755 683.354 -53.91322235 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_PARTITION_CHANNEL_20_PERCENT 1666.373 1115.591 -33.05274389 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_20_PERCENT 1996.95 928.448 -53.50669771 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT 1971.498 1037.014 -47.39969303 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT 1862.019 1094.6 -41.21434851 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT 1920.265 1144.75 -40.38583216 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 RLE_PARTITION_BIGINT 3052.618 1472.632 -51.7583923 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 RLE_PARTITION_NULL_BIGINT 12.411 6.855 -44.76673918 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 LONG_DECIMAL 4715.343 2281.85 -51.60797422 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 INTEGER 3594.349 1698.87 -52.7349737 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 SMALLINT 3357.586 1680.401 -49.95210845 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 BOOLEAN 2031.068 1238.094 -39.04221818 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 VARCHAR 9406.932 5580.815 -40.67337789 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 ARRAY_BIGINT 1792.839 1435.39 -19.93759618 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 ARRAY_VARCHAR 4074.899 3112.924 -23.60733358 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 ARRAY_ARRAY_BIGINT 4832.775 3708.222 -23.2693018 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 MAP_BIGINT_BIGINT 4504.912 3548.566 -21.22896074 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 MAP_BIGINT_MAP_BIGINT_BIGINT 11968.497 9777.244 -18.30850607 BenchmarkPartitionedOutputOperator.addPage 2 FALSE 0.2 256 8192 ROW_BIGINT_BIGINT 2252.62 1376.857 -38.87752928 --- .../operator/output/PagePartitioner.java | 274 +++++++++++++- .../output/PartitionedOutputOperator.java | 25 +- .../operator/output/PositionsAppender.java | 47 +++ .../output/PositionsAppenderFactory.java | 353 ++++++++++++++++++ .../sql/planner/LocalExecutionPlanner.java | 5 +- .../java/io/trino/block/BlockAssertions.java | 57 +++ .../BenchmarkPartitionedOutputOperator.java | 17 +- .../output/TestPartitionedOutputOperator.java | 11 +- 8 files changed, 763 insertions(+), 26 deletions(-) create mode 100644 core/trino-main/src/main/java/io/trino/operator/output/PositionsAppender.java create mode 100644 core/trino-main/src/main/java/io/trino/operator/output/PositionsAppenderFactory.java diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java index 897495ddb0aa..a62072256d36 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/PagePartitioner.java @@ -23,13 +23,16 @@ import io.trino.execution.buffer.PagesSerdeFactory; import io.trino.operator.OperatorContext; import io.trino.operator.PartitionFunction; -import io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputInfo; import io.trino.spi.Page; import io.trino.spi.PageBuilder; import io.trino.spi.block.Block; +import io.trino.spi.block.BlockBuilder; +import io.trino.spi.block.DictionaryBlock; import io.trino.spi.block.RunLengthEncodedBlock; import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.Type; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import javax.annotation.Nullable; @@ -39,10 +42,13 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.IntUnaryOperator; import java.util.function.Supplier; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Verify.verify; import static io.trino.execution.buffer.PageSplitterUtil.splitPage; +import static io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputInfo; import static io.trino.spi.block.PageBuilderStatus.DEFAULT_MAX_PAGE_SIZE_IN_BYTES; import static java.lang.Math.max; import static java.lang.Math.min; @@ -51,6 +57,7 @@ public class PagePartitioner { + private static final int COLUMNAR_STRATEGY_COEFFICIENT = 4; private final OutputBuffer outputBuffer; private final Type[] sourceTypes; private final PartitionFunction partitionFunction; @@ -63,8 +70,11 @@ public class PagePartitioner private final int nullChannel; // when >= 0, send the position to every partition if this channel is null private final AtomicLong rowsAdded = new AtomicLong(); private final AtomicLong pagesAdded = new AtomicLong(); - private boolean hasAnyRowBeenReplicated; private final OperatorContext operatorContext; + private final PositionsAppenderFactory positionsAppenderFactory; + private final PositionsAppender[] positionsAppenders; + + private boolean hasAnyRowBeenReplicated; public PagePartitioner( PartitionFunction partitionFunction, @@ -76,10 +86,12 @@ public PagePartitioner( PagesSerdeFactory serdeFactory, List sourceTypes, DataSize maxMemory, - OperatorContext operatorContext) + OperatorContext operatorContext, + PositionsAppenderFactory positionsAppenderFactory) { this.partitionFunction = requireNonNull(partitionFunction, "partitionFunction is null"); this.partitionChannels = Ints.toArray(requireNonNull(partitionChannels, "partitionChannels is null")); + this.positionsAppenderFactory = requireNonNull(positionsAppenderFactory, "positionsAppenderFactory is null"); Block[] partitionConstantBlocks = requireNonNull(partitionConstants, "partitionConstants is null").stream() .map(constant -> constant.map(NullableValue::asBlock).orElse(null)) .toArray(Block[]::new); @@ -112,6 +124,7 @@ public PagePartitioner( for (int i = 0; i < partitionCount; i++) { pageBuilders[i] = PageBuilder.withMaxPageSize(pageSize, sourceTypes); } + positionsAppenders = new PositionsAppender[sourceTypes.size()]; } public ListenableFuture isFull() @@ -157,6 +170,24 @@ private static Supplier createPartitionedOutputOperatorIn } public void partitionPage(Page page) + { + if (page.getPositionCount() == 0) { + return; + } + + if (page.getPositionCount() < partitionFunction.getPartitionCount() * COLUMNAR_STRATEGY_COEFFICIENT) { + // Partition will have on average less than COLUMNAR_STRATEGY_COEFFICIENT rows. + // Doing it column-wise would degrade performance, so we fall back to row-wise approach. + // Performance degradation is the worst in case of skewed hash distribution when only small subset + // of partitions is selected. + partitionPageByRow(page); + } + else { + partitionPageByColumn(page); + } + } + + public void partitionPageByRow(Page page) { requireNonNull(page, "page is null"); if (page.getPositionCount() == 0) { @@ -202,6 +233,229 @@ public void partitionPage(Page page) flush(false); } + private void appendRow(PageBuilder pageBuilder, Page page, int position) + { + pageBuilder.declarePosition(); + + for (int channel = 0; channel < sourceTypes.length; channel++) { + Type type = sourceTypes[channel]; + type.appendTo(page.getBlock(channel), position, pageBuilder.getBlockBuilder(channel)); + } + } + + public void partitionPageByColumn(Page page) + { + IntArrayList[] partitionedPositions = partitionPositions(page); + + PositionsAppender[] positionsAppenders = getAppenders(page); + + for (int i = 0; i < partitionFunction.getPartitionCount(); i++) { + IntArrayList partitionPositions = partitionedPositions[i]; + if (!partitionPositions.isEmpty()) { + appendToOutputPartition(pageBuilders[i], page, partitionPositions, positionsAppenders); + partitionPositions.clear(); + } + } + + flush(false); + } + + private PositionsAppender[] getAppenders(Page page) + { + for (int i = 0; i < positionsAppenders.length; i++) { + positionsAppenders[i] = positionsAppenderFactory.create(sourceTypes[i], page.getBlock(i).getClass()); + } + return positionsAppenders; + } + + private IntArrayList[] partitionPositions(Page page) + { + verify(page.getPositionCount() > 0, "position count is 0"); + IntArrayList[] partitionPositions = initPositions(page); + int position; + // Handle "any row" replication outside the inner loop processing + if (replicatesAnyRow && !hasAnyRowBeenReplicated) { + for (IntList partitionPosition : partitionPositions) { + partitionPosition.add(0); + } + hasAnyRowBeenReplicated = true; + position = 1; + } + else { + position = 0; + } + + Page partitionFunctionArgs = getPartitionFunctionArguments(page); + + if (partitionFunctionArgs.getChannelCount() > 0 && onlyRleBlocks(partitionFunctionArgs)) { + // we need at least one Rle block since with no blocks partition function + // can return a different value per invocation (e.g. RoundRobinBucketFunction) + partitionBySingleRleValue(page, position, partitionFunctionArgs, partitionPositions); + } + else if (partitionFunctionArgs.getChannelCount() == 1 && isDictionaryProcessingFaster(partitionFunctionArgs.getBlock(0))) { + partitionBySingleDictionary(page, position, partitionFunctionArgs, partitionPositions); + } + else { + partitionGeneric(page, position, aPosition -> partitionFunction.getPartition(partitionFunctionArgs, aPosition), partitionPositions); + } + return partitionPositions; + } + + private void appendToOutputPartition(PageBuilder outputPartition, Page page, IntArrayList positions, PositionsAppender[] positionsAppenders) + { + outputPartition.declarePositions(positions.size()); + + for (int channel = 0; channel < positionsAppenders.length; channel++) { + Block partitionBlock = page.getBlock(channel); + BlockBuilder target = outputPartition.getBlockBuilder(channel); + positionsAppenders[channel].appendTo(positions, partitionBlock, target); + } + } + + private IntArrayList[] initPositions(Page page) + { + // We allocate new arrays for every page (instead of caching them) because we don't + // want memory to explode in case there are input pages with many positions, where each page + // is assigned to a single partition entirely. + // For example this can happen for partition columns if they are represented by RLE blocks. + IntArrayList[] partitionPositions = new IntArrayList[partitionFunction.getPartitionCount()]; + for (int i = 0; i < partitionPositions.length; i++) { + partitionPositions[i] = new IntArrayList(initialPartitionSize(page.getPositionCount() / partitionFunction.getPartitionCount())); + } + return partitionPositions; + } + + private static int initialPartitionSize(int averagePositionsPerPartition) + { + // 1.1 coefficient compensates for the not perfect hash distribution. + // 32 compensates for the case when averagePositionsPerPartition is small, + // and we would see more variance in the hash distribution. + return (int) (averagePositionsPerPartition * 1.1) + 32; + } + + private boolean onlyRleBlocks(Page page) + { + for (int i = 0; i < page.getChannelCount(); i++) { + if (!(page.getBlock(i) instanceof RunLengthEncodedBlock)) { + return false; + } + } + return true; + } + + private void partitionBySingleRleValue(Page page, int position, Page partitionFunctionArgs, IntArrayList[] partitionPositions) + { + // copy all positions because all hash function args are the same for every position + if (nullChannel != -1 && page.getBlock(nullChannel).isNull(0)) { + verify(page.getBlock(nullChannel) instanceof RunLengthEncodedBlock, "null channel is not RunLengthEncodedBlock", page.getBlock(nullChannel)); + // all positions are null + int[] allPositions = integersInRange(position, page.getPositionCount()); + for (IntList partitionPosition : partitionPositions) { + partitionPosition.addElements(position, allPositions); + } + } + else { + // extract rle page to prevent JIT profile pollution + Page rlePage = extractRlePage(partitionFunctionArgs); + + int partition = partitionFunction.getPartition(rlePage, 0); + IntArrayList positions = partitionPositions[partition]; + for (int i = position; i < page.getPositionCount(); i++) { + positions.add(i); + } + } + } + + private Page extractRlePage(Page page) + { + Block[] valueBlocks = new Block[page.getChannelCount()]; + for (int channel = 0; channel < valueBlocks.length; ++channel) { + valueBlocks[channel] = ((RunLengthEncodedBlock) page.getBlock(channel)).getValue(); + } + return new Page(valueBlocks); + } + + private int[] integersInRange(int start, int endExclusive) + { + int[] array = new int[endExclusive - start]; + int current = start; + for (int i = 0; i < array.length; i++) { + array[i] = current++; + } + return array; + } + + private boolean isDictionaryProcessingFaster(Block block) + { + if (!(block instanceof DictionaryBlock)) { + return false; + } + DictionaryBlock dictionaryBlock = (DictionaryBlock) block; + // if dictionary block positionCount is greater than number of elements in the dictionary + // it will be faster to compute hash for the dictionary values only once and re-use it + // instead of recalculating it. + return dictionaryBlock.getPositionCount() > dictionaryBlock.getDictionary().getPositionCount(); + } + + private void partitionBySingleDictionary(Page page, int position, Page partitionFunctionArgs, IntArrayList[] partitionPositions) + { + DictionaryBlock dictionaryBlock = (DictionaryBlock) partitionFunctionArgs.getBlock(0); + Block dictionary = dictionaryBlock.getDictionary(); + int[] dictionaryPartitions = new int[dictionary.getPositionCount()]; + Page dictionaryPage = new Page(dictionary); + for (int i = 0; i < dictionary.getPositionCount(); i++) { + dictionaryPartitions[i] = partitionFunction.getPartition(dictionaryPage, i); + } + + partitionGeneric(page, position, aPosition -> dictionaryPartitions[dictionaryBlock.getId(aPosition)], partitionPositions); + } + + private void partitionGeneric(Page page, int position, IntUnaryOperator partitionFunction, IntArrayList[] partitionPositions) + { + // Skip null block checks if mayHaveNull reports that no positions will be null + if (nullChannel != -1 && page.getBlock(nullChannel).mayHaveNull()) { + partitionNullablePositions(page, position, partitionPositions, partitionFunction); + } + else { + partitionNotNullPositions(page, position, partitionPositions, partitionFunction); + } + } + + private IntArrayList[] partitionNullablePositions(Page page, int position, IntArrayList[] partitionPositions, IntUnaryOperator partitionFunction) + { + Block nullsBlock = page.getBlock(nullChannel); + int[] nullPositions = new int[page.getPositionCount()]; + int[] nonNullPositions = new int[page.getPositionCount()]; + int nullCount = 0; + int nonNullCount = 0; + for (int i = position; i < page.getPositionCount(); i++) { + nullPositions[nullCount] = i; + nonNullPositions[nonNullCount] = i; + int isNull = nullsBlock.isNull(i) ? 1 : 0; + nullCount += isNull; + nonNullCount += isNull ^ 1; + } + for (IntArrayList positions : partitionPositions) { + positions.addElements(position, nullPositions, 0, nullCount); + } + for (int i = 0; i < nonNullCount; i++) { + int nonNullPosition = nonNullPositions[i]; + int partition = partitionFunction.applyAsInt(nonNullPosition); + partitionPositions[partition].add(nonNullPosition); + } + return partitionPositions; + } + + private IntArrayList[] partitionNotNullPositions(Page page, int startingPosition, IntArrayList[] partitionPositions, IntUnaryOperator partitionFunction) + { + for (int position = startingPosition; position < page.getPositionCount(); position++) { + int partition = partitionFunction.applyAsInt(position); + partitionPositions[partition].add(position); + } + + return partitionPositions; + } + private Page getPartitionFunctionArguments(Page page) { // Fast path for no constants @@ -222,16 +476,6 @@ private Page getPartitionFunctionArguments(Page page) return new Page(page.getPositionCount(), blocks); } - private void appendRow(PageBuilder pageBuilder, Page page, int position) - { - pageBuilder.declarePosition(); - - for (int channel = 0; channel < sourceTypes.length; channel++) { - Type type = sourceTypes[channel]; - type.appendTo(page.getBlock(channel), position, pageBuilder.getBlockBuilder(channel)); - } - } - public void flush(boolean force) { try (PagesSerde.PagesSerdeContext context = serde.newContext()) { @@ -256,8 +500,8 @@ private List splitAndSerializePage(PagesSerde.PagesSerdeContext context, { List split = splitPage(page, DEFAULT_MAX_PAGE_SIZE_IN_BYTES); ImmutableList.Builder builder = ImmutableList.builderWithExpectedSize(split.size()); - for (Page p : split) { - builder.add(serde.serialize(context, p)); + for (Page chunk : split) { + builder.add(serde.serialize(context, chunk)); } return builder.build(); } diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java index ee6dd54fc2f2..355340b8c71c 100644 --- a/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java +++ b/core/trino-main/src/main/java/io/trino/operator/output/PartitionedOutputOperator.java @@ -54,6 +54,7 @@ public static class PartitionedOutputFactory private final boolean replicatesAnyRow; private final OptionalInt nullChannel; private final DataSize maxMemory; + private final PositionsAppenderFactory positionsAppenderFactory; public PartitionedOutputFactory( PartitionFunction partitionFunction, @@ -62,7 +63,8 @@ public PartitionedOutputFactory( boolean replicatesAnyRow, OptionalInt nullChannel, OutputBuffer outputBuffer, - DataSize maxMemory) + DataSize maxMemory, + PositionsAppenderFactory positionsAppenderFactory) { this.partitionFunction = requireNonNull(partitionFunction, "partitionFunction is null"); this.partitionChannels = requireNonNull(partitionChannels, "partitionChannels is null"); @@ -71,6 +73,7 @@ public PartitionedOutputFactory( this.nullChannel = requireNonNull(nullChannel, "nullChannel is null"); this.outputBuffer = requireNonNull(outputBuffer, "outputBuffer is null"); this.maxMemory = requireNonNull(maxMemory, "maxMemory is null"); + this.positionsAppenderFactory = requireNonNull(positionsAppenderFactory, "positionsAppenderFactory is null"); } @Override @@ -93,7 +96,8 @@ public OperatorFactory createOutputOperator( nullChannel, outputBuffer, serdeFactory, - maxMemory); + maxMemory, + positionsAppenderFactory); } } @@ -112,6 +116,7 @@ public static class PartitionedOutputOperatorFactory private final OutputBuffer outputBuffer; private final PagesSerdeFactory serdeFactory; private final DataSize maxMemory; + private final PositionsAppenderFactory positionsAppenderFactory; public PartitionedOutputOperatorFactory( int operatorId, @@ -125,7 +130,8 @@ public PartitionedOutputOperatorFactory( OptionalInt nullChannel, OutputBuffer outputBuffer, PagesSerdeFactory serdeFactory, - DataSize maxMemory) + DataSize maxMemory, + PositionsAppenderFactory positionsAppenderFactory) { this.operatorId = operatorId; this.planNodeId = requireNonNull(planNodeId, "planNodeId is null"); @@ -139,6 +145,7 @@ public PartitionedOutputOperatorFactory( this.outputBuffer = requireNonNull(outputBuffer, "outputBuffer is null"); this.serdeFactory = requireNonNull(serdeFactory, "serdeFactory is null"); this.maxMemory = requireNonNull(maxMemory, "maxMemory is null"); + this.positionsAppenderFactory = requireNonNull(positionsAppenderFactory, "positionsAppenderFactory is null"); } @Override @@ -156,7 +163,8 @@ public Operator createOperator(DriverContext driverContext) nullChannel, outputBuffer, serdeFactory, - maxMemory); + maxMemory, + positionsAppenderFactory); } @Override @@ -179,7 +187,8 @@ public OperatorFactory duplicate() nullChannel, outputBuffer, serdeFactory, - maxMemory); + maxMemory, + positionsAppenderFactory); } } @@ -202,7 +211,8 @@ public PartitionedOutputOperator( OptionalInt nullChannel, OutputBuffer outputBuffer, PagesSerdeFactory serdeFactory, - DataSize maxMemory) + DataSize maxMemory, + PositionsAppenderFactory positionsAppenderFactory) { this.operatorContext = requireNonNull(operatorContext, "operatorContext is null"); this.pagePreprocessor = requireNonNull(pagePreprocessor, "pagePreprocessor is null"); @@ -216,7 +226,8 @@ public PartitionedOutputOperator( serdeFactory, sourceTypes, maxMemory, - operatorContext); + operatorContext, + positionsAppenderFactory); operatorContext.setInfoSupplier(this.partitionFunction.getOperatorInfoSupplier()); this.memoryContext = operatorContext.newLocalUserMemoryContext(PartitionedOutputOperator.class.getSimpleName()); diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppender.java b/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppender.java new file mode 100644 index 000000000000..0b5aa8414f8b --- /dev/null +++ b/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppender.java @@ -0,0 +1,47 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.trino.operator.output; + +import io.trino.spi.block.Block; +import io.trino.spi.block.BlockBuilder; +import io.trino.spi.type.Type; +import it.unimi.dsi.fastutil.ints.IntArrayList; + +import static java.util.Objects.requireNonNull; + +public interface PositionsAppender +{ + void appendTo(IntArrayList positions, Block source, BlockBuilder target); + + class TypedPositionsAppender + implements PositionsAppender + { + private final Type type; + + public TypedPositionsAppender(Type type) + { + this.type = requireNonNull(type, "type is null"); + } + + @Override + public void appendTo(IntArrayList positions, Block source, BlockBuilder target) + { + int[] positionArray = positions.elements(); + for (int i = 0; i < positions.size(); i++) { + type.appendTo(source, positionArray[i], target); + } + } + } +} diff --git a/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppenderFactory.java b/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppenderFactory.java new file mode 100644 index 000000000000..41021d98b70e --- /dev/null +++ b/core/trino-main/src/main/java/io/trino/operator/output/PositionsAppenderFactory.java @@ -0,0 +1,353 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.operator.output; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import io.airlift.bytecode.DynamicClassLoader; +import io.trino.collect.cache.NonEvictableLoadingCache; +import io.trino.operator.output.PositionsAppender.TypedPositionsAppender; +import io.trino.spi.block.Block; +import io.trino.spi.block.BlockBuilder; +import io.trino.spi.block.Int128ArrayBlock; +import io.trino.spi.block.Int96ArrayBlock; +import io.trino.spi.type.FixedWidthType; +import io.trino.spi.type.Type; +import io.trino.spi.type.VariableWidthType; +import io.trino.sql.gen.IsolatedClass; +import it.unimi.dsi.fastutil.ints.IntArrayList; + +import java.util.Objects; +import java.util.Optional; + +import static io.airlift.slice.SizeOf.SIZE_OF_LONG; +import static io.trino.collect.cache.SafeCaches.buildNonEvictableCache; +import static java.util.Objects.requireNonNull; + +/** + * Isolates the {@code PositionsAppender} class per type and block tuples. + * Type specific {@code PositionsAppender} implementations manually inline {@code Type#appendTo} method inside the loop + * to avoid virtual(mega-morphic) calls and force jit to inline the {@code Block} and {@code BlockBuilder} methods. + * Ideally, {@code TypedPositionsAppender} could work instead of type specific {@code PositionsAppender}s, + * but in practice jit falls back to virtual calls in some cases (e.g. {@link Block#isNull}). + */ +public class PositionsAppenderFactory +{ + private final NonEvictableLoadingCache cache; + + public PositionsAppenderFactory() + { + this.cache = buildNonEvictableCache( + CacheBuilder.newBuilder().maximumSize(1000), + CacheLoader.from(key -> createAppender(key.type))); + } + + public PositionsAppender create(Type type, Class blockClass) + { + return cache.getUnchecked(new CacheKey(type, blockClass)); + } + + private PositionsAppender createAppender(Type type) + { + return Optional.ofNullable(findDedicatedAppenderClassFor(type)) + .map(this::isolateAppender) + .orElseGet(() -> isolateTypeAppender(type)); + } + + private Class findDedicatedAppenderClassFor(Type type) + { + if (type instanceof FixedWidthType) { + switch (((FixedWidthType) type).getFixedSize()) { + case Byte.BYTES: + return BytePositionsAppender.class; + case Short.BYTES: + return SmallintPositionsAppender.class; + case Integer.BYTES: + return IntPositionsAppender.class; + case Long.BYTES: + return LongPositionsAppender.class; + case Int96ArrayBlock.INT96_BYTES: + return Int96PositionsAppender.class; + case Int128ArrayBlock.INT128_BYTES: + return Int128PositionsAppender.class; + default: + // size not supported directly, fallback to the generic appender + } + } + else if (type instanceof VariableWidthType) { + return SlicePositionsAppender.class; + } + + return null; + } + + private PositionsAppender isolateTypeAppender(Type type) + { + Class isolatedAppenderClass = isolateAppenderClass(TypedPositionsAppender.class); + try { + return isolatedAppenderClass.getConstructor(Type.class).newInstance(type); + } + catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private PositionsAppender isolateAppender(Class appenderClass) + { + Class isolatedAppenderClass = isolateAppenderClass(appenderClass); + try { + return isolatedAppenderClass.getConstructor().newInstance(); + } + catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private Class isolateAppenderClass(Class appenderClass) + { + DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(PositionsAppender.class.getClassLoader()); + + Class isolatedBatchPositionsTransferClass = IsolatedClass.isolateClass( + dynamicClassLoader, + PositionsAppender.class, + appenderClass); + return isolatedBatchPositionsTransferClass; + } + + public static class LongPositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeLong(block.getLong(position, 0)).closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + blockBuilder.writeLong(block.getLong(positionArray[i], 0)).closeEntry(); + } + } + } + } + + public static class IntPositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeInt(block.getInt(position, 0)).closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + blockBuilder.writeInt(block.getInt(positionArray[i], 0)).closeEntry(); + } + } + } + } + + public static class BytePositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeByte(block.getByte(position, 0)).closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + blockBuilder.writeByte(block.getByte(positionArray[i], 0)).closeEntry(); + } + } + } + } + + public static class SlicePositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + block.writeBytesTo(position, 0, block.getSliceLength(position), blockBuilder); + blockBuilder.closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + block.writeBytesTo(position, 0, block.getSliceLength(position), blockBuilder); + blockBuilder.closeEntry(); + } + } + } + } + + public static class SmallintPositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeShort(block.getShort(position, 0)).closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + blockBuilder.writeShort(block.getShort(positionArray[i], 0)).closeEntry(); + } + } + } + } + + public static class Int96PositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeLong(block.getLong(position, 0)); + blockBuilder.writeInt(block.getInt(position, SIZE_OF_LONG)); + blockBuilder.closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + blockBuilder.writeLong(block.getLong(position, 0)); + blockBuilder.writeInt(block.getInt(position, SIZE_OF_LONG)); + blockBuilder.closeEntry(); + } + } + } + } + + public static class Int128PositionsAppender + implements PositionsAppender + { + @Override + public void appendTo(IntArrayList positions, Block block, BlockBuilder blockBuilder) + { + int[] positionArray = positions.elements(); + if (block.mayHaveNull()) { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + if (block.isNull(position)) { + blockBuilder.appendNull(); + } + else { + blockBuilder.writeLong(block.getLong(position, 0)); + blockBuilder.writeLong(block.getLong(position, SIZE_OF_LONG)); + blockBuilder.closeEntry(); + } + } + } + else { + for (int i = 0; i < positions.size(); i++) { + int position = positionArray[i]; + blockBuilder.writeLong(block.getLong(position, 0)); + blockBuilder.writeLong(block.getLong(position, SIZE_OF_LONG)); + blockBuilder.closeEntry(); + } + } + } + } + + private static class CacheKey + { + private final Type type; + private final Class blockClass; + + private CacheKey(Type type, Class blockClass) + { + this.type = requireNonNull(type, "type is null"); + this.blockClass = requireNonNull(blockClass, "blockClass is null"); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CacheKey cacheKey = (CacheKey) o; + return type.equals(cacheKey.type) && blockClass.equals(cacheKey.blockClass); + } + + @Override + public int hashCode() + { + return Objects.hash(type, blockClass); + } + } +} diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java index fe8f54e49213..859a1ff2dcfd 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java @@ -123,6 +123,7 @@ import io.trino.operator.join.NestedLoopJoinPagesSupplier; import io.trino.operator.join.PartitionedLookupSourceFactory; import io.trino.operator.output.PartitionedOutputOperator.PartitionedOutputFactory; +import io.trino.operator.output.PositionsAppenderFactory; import io.trino.operator.output.TaskOutputOperator.TaskOutputFactory; import io.trino.operator.project.CursorProcessor; import io.trino.operator.project.PageProcessor; @@ -386,6 +387,7 @@ public class LocalExecutionPlanner private final BlockTypeOperators blockTypeOperators; private final TableExecuteContextManager tableExecuteContextManager; private final ExchangeManagerRegistry exchangeManagerRegistry; + private final PositionsAppenderFactory positionsAppenderFactory = new PositionsAppenderFactory(); @Inject public LocalExecutionPlanner( @@ -523,7 +525,8 @@ public LocalExecutionPlan plan( partitioningScheme.isReplicateNullsAndAny(), nullChannel, outputBuffer, - maxPagePartitioningBufferSize)); + maxPagePartitioningBufferSize, + positionsAppenderFactory)); } public LocalExecutionPlan plan( diff --git a/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java b/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java index ea83827a88ab..fc6b4423efa5 100644 --- a/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java +++ b/core/trino-main/src/test/java/io/trino/block/BlockAssertions.java @@ -26,8 +26,11 @@ import io.trino.spi.type.CharType; import io.trino.spi.type.DecimalType; import io.trino.spi.type.Int128; +import io.trino.spi.type.LongTimestamp; import io.trino.spi.type.MapType; import io.trino.spi.type.RowType; +import io.trino.spi.type.SqlTimestamp; +import io.trino.spi.type.TimestampType; import io.trino.spi.type.Type; import java.math.BigDecimal; @@ -68,6 +71,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.testing.TestingConnectorSession.SESSION; import static io.trino.type.ColorType.COLOR; +import static io.trino.type.IpAddressType.IPADDRESS; import static java.lang.Float.floatToRawIntBits; import static java.lang.Math.multiplyExact; import static java.lang.String.format; @@ -174,9 +178,19 @@ public static Block createRandomBlockForType(Type type, int positionCount, float if (type == UUID) { return createRandomUUIDsBlock(positionCount, nullRate); } + if (type == IPADDRESS) { + return createRandomIpAddressesBlock(positionCount, nullRate); + } if (type == VARBINARY) { return createRandomVarbinariesBlock(positionCount, nullRate); } + if (type instanceof TimestampType) { + TimestampType timestampType = (TimestampType) type; + if (timestampType.isShort()) { + return createRandomShortTimestampBlock(timestampType, positionCount, nullRate); + } + return createRandomLongTimestampBlock(timestampType, positionCount, nullRate); + } return createRandomBlockForNestedType(type, positionCount, nullRate); } @@ -248,6 +262,28 @@ public static Block createRandomLongDecimalsBlock(int positionCount, float nullR () -> String.valueOf(RANDOM.nextLong()))); } + public static Block createRandomShortTimestampBlock(TimestampType type, int positionCount, float nullRate) + { + return createLongsBlock( + generateListWithNulls( + positionCount, + nullRate, + () -> SqlTimestamp.fromMillis(type.getPrecision(), RANDOM.nextLong()).getEpochMicros())); + } + + public static Block createRandomLongTimestampBlock(TimestampType type, int positionCount, float nullRate) + { + return createLongTimestampBlock( + type, + generateListWithNulls( + positionCount, + nullRate, + () -> { + SqlTimestamp sqlTimestamp = SqlTimestamp.fromMillis(type.getPrecision(), RANDOM.nextLong()); + return new LongTimestamp(sqlTimestamp.getEpochMicros(), sqlTimestamp.getPicosOfMicros()); + })); + } + public static Block createRandomLongsBlock(int positionCount, int numberOfUniqueValues) { checkArgument(positionCount >= numberOfUniqueValues, "numberOfUniqueValues must be between 1 and positionCount: %s but was %s", positionCount, numberOfUniqueValues); @@ -288,6 +324,11 @@ private static Block createRandomUUIDsBlock(int positionCount, float nullRate) return createSlicesBlock(UUID, generateListWithNulls(positionCount, nullRate, () -> Slices.wrappedLongArray(RANDOM.nextLong(), RANDOM.nextLong()))); } + private static Block createRandomIpAddressesBlock(int positionCount, float nullRate) + { + return createSlicesBlock(IPADDRESS, generateListWithNulls(positionCount, nullRate, () -> Slices.wrappedLongArray(RANDOM.nextLong(), RANDOM.nextLong()))); + } + private static Block createRandomTinyintsBlock(int positionCount, float nullRate) { return createTypedLongsBlock(TINYINT, generateListWithNulls(positionCount, nullRate, () -> (long) (byte) RANDOM.nextLong())); @@ -473,6 +514,22 @@ public static Block createLongDecimalsBlock(Iterable values) return builder.build(); } + public static Block createLongTimestampBlock(TimestampType type, Iterable values) + { + BlockBuilder builder = type.createBlockBuilder(null, 100); + + for (LongTimestamp value : values) { + if (value == null) { + builder.appendNull(); + } + else { + type.writeObject(builder, value); + } + } + + return builder.build(); + } + public static Block createCharsBlock(CharType charType, List values) { return createBlock(charType, charType::writeString, values); diff --git a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java index 53f606ac699d..74c815face77 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java @@ -109,6 +109,8 @@ @BenchmarkMode(Mode.AverageTime) public class BenchmarkPartitionedOutputOperator { + private static final PositionsAppenderFactory POSITIONS_APPENDER_FACTORY = new PositionsAppenderFactory(); + @Benchmark public void addPage(BenchmarkData data) { @@ -158,6 +160,7 @@ public static class BenchmarkData "BIGINT_DICTIONARY_PARTITION_CHANNEL_50_PERCENT", "BIGINT_DICTIONARY_PARTITION_CHANNEL_80_PERCENT", "BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT", + "BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT_MINUS_1", "RLE_PARTITION_BIGINT", "RLE_PARTITION_NULL_BIGINT", "LONG_DECIMAL", @@ -270,6 +273,17 @@ public Page createPage(List types, int positionCount, float nullRate) createLongDictionaryBlock(0, positionCount, positionCount)); } }, + BIGINT_DICTIONARY_PARTITION_CHANNEL_100_PERCENT_MINUS_1(BigintType.BIGINT, 3000) { + @Override + public Page createPage(List types, int positionCount, float nullRate) + { + return page( + positionCount, + types.size(), + () -> createRandomBlockForType(BigintType.BIGINT, positionCount, nullRate), + createLongDictionaryBlock(0, positionCount, positionCount - 1)); + } + }, RLE_PARTITION_BIGINT(BigintType.BIGINT, 5000) { @Override public Page createPage(List types, int positionCount, float nullRate) @@ -423,7 +437,8 @@ private PartitionedOutputOperator createPartitionedOutputOperator() false, OptionalInt.empty(), buffer, - MAX_PARTITION_BUFFER_SIZE); + MAX_PARTITION_BUFFER_SIZE, + POSITIONS_APPENDER_FACTORY); return (PartitionedOutputOperator) operatorFactory .createOutputOperator(0, new PlanNodeId("plan-node-0"), types, Function.identity(), serdeFactory) .createOperator(createDriverContext()); diff --git a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java index 01691c3de0e0..b5d591b38f32 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java @@ -40,6 +40,7 @@ import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.ArrayType; import io.trino.spi.type.Decimals; +import io.trino.spi.type.TimestampType; import io.trino.spi.type.Type; import io.trino.sql.planner.plan.PlanNodeId; import io.trino.testing.TestingTaskContext; @@ -82,6 +83,7 @@ import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.sql.planner.SystemPartitioningHandle.SystemPartitionFunction.ROUND_ROBIN; +import static io.trino.type.IpAddressType.IPADDRESS; import static java.lang.Math.toIntExact; import static java.util.Collections.nCopies; import static java.util.Collections.unmodifiableList; @@ -372,7 +374,10 @@ public static Object[][] types() {VARBINARY}, {createDecimalType(1)}, {createDecimalType(Decimals.MAX_SHORT_PRECISION + 1)}, - {new ArrayType(BIGINT)} + {new ArrayType(BIGINT)}, + {TimestampType.createTimestampType(9)}, + {TimestampType.createTimestampType(3)}, + {IPADDRESS} }; } @@ -429,6 +434,7 @@ private PartitionedOutputOperatorBuilder partitionedOutputOperator() static class PartitionedOutputOperatorBuilder { + public static final PositionsAppenderFactory POSITIONS_APPENDER_FACTORY = new PositionsAppenderFactory(); private final ExecutorService executor; private final ScheduledExecutorService scheduledExecutor; private final OutputBuffer outputBuffer; @@ -523,7 +529,8 @@ public PartitionedOutputOperator build() shouldReplicate, nullChannel, outputBuffer, - PARTITION_MAX_MEMORY); + PARTITION_MAX_MEMORY, + POSITIONS_APPENDER_FACTORY); return (PartitionedOutputOperator) operatorFactory .createOutputOperator(0, new PlanNodeId("plan-node-0"), types, Function.identity(), PAGES_SERDE_FACTORY) From 7a775c87ccbdbdcb351a5d0a4167654259806145 Mon Sep 17 00:00:00 2001 From: Lukasz Stec Date: Fri, 4 Mar 2022 09:13:25 +0100 Subject: [PATCH 5/5] empty