Skip to content

Commit 44cc12f

Browse files
committed
Improve performance of PagesIndexComparator for strings
Made changes to prefer adapting ordering operator from the more efficient version of DefaultOrderingOperators#comparisonOperator that avoids unnecessary copies of Slice for comparison BenchmarkPagesIndexOrdering.benchmarkQuickSort (numberOfChannels) (typeName) Mode Cnt Before score After score Unit 1 BIGINT avgt 20 29.536 ± 0.696 28.299 ± 0.344 ms/op 1 VARCHAR avgt 20 66.897 ± 1.914 53.538 ± 0.635 ms/op 10 BIGINT avgt 20 36.965 ± 0.270 36.577 ± 0.605 ms/op 10 VARCHAR avgt 20 79.887 ± 3.077 60.413 ± 0.678 ms/op
1 parent 3b5216c commit 44cc12f

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

core/trino-spi/src/main/java/io/trino/spi/type/TypeOperators.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.FLAT;
4444
import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL;
4545
import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NULL_FLAG;
46+
import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.VALUE_BLOCK_POSITION_NOT_NULL;
4647
import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.BLOCK_BUILDER;
4748
import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.FAIL_ON_NULL;
4849
import static io.trino.spi.function.InvocationConvention.simpleConvention;
@@ -496,7 +497,12 @@ private OperatorMethodHandle generateOrderingOperator(OperatorConvention operato
496497
SortOrder sortOrder = operatorConvention.sortOrder().orElseThrow(() -> new IllegalArgumentException("Operator convention does not contain a sort order"));
497498
OperatorType comparisonType = operatorConvention.operatorType();
498499
if (operatorConvention.callingConvention().getArgumentConventions().equals(List.of(BLOCK_POSITION, BLOCK_POSITION))) {
499-
OperatorConvention comparisonOperator = new OperatorConvention(operatorConvention.type(), comparisonType, Optional.empty(), simpleConvention(FAIL_ON_NULL, BLOCK_POSITION, BLOCK_POSITION));
500+
OperatorConvention comparisonOperator = new OperatorConvention(
501+
operatorConvention.type(),
502+
comparisonType,
503+
Optional.empty(),
504+
// null positions are handled separately in adaptBlockPositionComparisonToOrdering and not used in the comparison
505+
simpleConvention(FAIL_ON_NULL, BLOCK_POSITION_NOT_NULL, BLOCK_POSITION_NOT_NULL));
500506
MethodHandle comparisonInvoker = adaptOperator(comparisonOperator);
501507
return adaptBlockPositionComparisonToOrdering(sortOrder, comparisonInvoker);
502508
}
@@ -541,6 +547,9 @@ private static int getScore(OperatorMethodHandle operatorMethodHandle)
541547
else if (argument == BLOCK_POSITION) {
542548
score += 1;
543549
}
550+
else if (argument == VALUE_BLOCK_POSITION_NOT_NULL) {
551+
score += 1;
552+
}
544553
}
545554
return score;
546555
}

0 commit comments

Comments
 (0)