From b4b1f37b5c0c1e09f7818b450b0e16b0d2c3033d Mon Sep 17 00:00:00 2001 From: Piotr Findeisen Date: Fri, 7 Oct 2022 17:08:06 +0200 Subject: [PATCH] Cache short decimal type instances When profiling Iceberg planning on TPC-DS data set, it was found out that 10% of time spend inside `TableStatisticsMaker` is actually spent inside `ShortDecimalType` constructor. --- .../java/io/trino/spi/type/DecimalType.java | 2 +- .../io/trino/spi/type/ShortDecimalType.java | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/DecimalType.java b/core/trino-spi/src/main/java/io/trino/spi/type/DecimalType.java index c83c661e7583..e3a19bb94fab 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/DecimalType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/DecimalType.java @@ -41,7 +41,7 @@ public static DecimalType createDecimalType(int precision, int scale) } if (precision <= MAX_SHORT_PRECISION) { - return new ShortDecimalType(precision, scale); + return ShortDecimalType.getInstance(precision, scale); } return new LongDecimalType(precision, scale); } diff --git a/core/trino-spi/src/main/java/io/trino/spi/type/ShortDecimalType.java b/core/trino-spi/src/main/java/io/trino/spi/type/ShortDecimalType.java index 788cfa9f6d36..769293a6b9dd 100644 --- a/core/trino-spi/src/main/java/io/trino/spi/type/ShortDecimalType.java +++ b/core/trino-spi/src/main/java/io/trino/spi/type/ShortDecimalType.java @@ -34,6 +34,7 @@ import static io.trino.spi.function.OperatorType.LESS_THAN; import static io.trino.spi.function.OperatorType.LESS_THAN_OR_EQUAL; import static io.trino.spi.function.OperatorType.XX_HASH_64; +import static io.trino.spi.type.Decimals.MAX_SHORT_PRECISION; import static io.trino.spi.type.TypeOperatorDeclaration.extractOperatorDeclaration; import static java.lang.invoke.MethodHandles.lookup; @@ -42,7 +43,23 @@ final class ShortDecimalType { private static final TypeOperatorDeclaration TYPE_OPERATOR_DECLARATION = extractOperatorDeclaration(ShortDecimalType.class, lookup(), long.class); - ShortDecimalType(int precision, int scale) + private static final ShortDecimalType[][] INSTANCES; + + static { + INSTANCES = new ShortDecimalType[MAX_SHORT_PRECISION][MAX_SHORT_PRECISION + 1]; + for (int precision = 1; precision <= MAX_SHORT_PRECISION; precision++) { + for (int scale = 0; scale <= precision; scale++) { + INSTANCES[precision - 1][scale] = new ShortDecimalType(precision, scale); + } + } + } + + static ShortDecimalType getInstance(int precision, int scale) + { + return INSTANCES[precision - 1][scale]; + } + + private ShortDecimalType(int precision, int scale) { super(precision, scale, long.class); checkArgument(0 < precision && precision <= Decimals.MAX_SHORT_PRECISION, "Invalid precision: %s", precision);