[ https://issues.apache.org/jira/browse/HIVE-13306?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Teddy Choi updated HIVE-13306: ------------------------------ Attachment: HIVE-13306.4.patch {noformat} Benchmark Mode Samples Score Error Units o.a.h.b.v.VectorizedDecimalBench.DecimalColAdd128ColNewBench.bench avgt 10 125432.861 ± 103309.156 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColAdd128ColOldBench.bench avgt 10 2232555.450 ± 762572.051 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColAdd64ColNewBench.bench avgt 10 4357.643 ± 556.718 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColAdd64ColOldBench.bench avgt 10 489554.055 ± 149226.021 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv128By16ColNewBench.bench avgt 10 181819.546 ± 21990.896 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv128By16ColOldBench.bench avgt 10 1526826.250 ± 83937.964 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv128ColNewBench.bench avgt 10 368991.791 ± 29543.595 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv128ColOldBench.bench avgt 10 1559152.400 ± 102530.203 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv64ColNewBench.bench avgt 10 36004.327 ± 1297.898 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColDiv64ColOldBench.bench avgt 10 1342905.950 ± 258527.407 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColMul128ColNewBench.bench avgt 10 150020.394 ± 14490.045 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColMul128ColOldBench.bench avgt 10 948766.333 ± 49017.424 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColMul64ColNewBench.bench avgt 10 4190.397 ± 305.294 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColMul64ColOldBench.bench avgt 10 1065696.767 ± 67010.116 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColSub128ColNewBench.bench avgt 10 113723.319 ± 112854.654 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColSub128ColOldBench.bench avgt 10 1384364.200 ± 103055.925 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColSub64ColNewBench.bench avgt 10 4212.439 ± 165.751 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalColSub64ColOldBench.bench avgt 10 863108.092 ± 59991.382 ns/op o.a.h.b.v.VectorizedDecimalBench.DecimalToString128ColBench.bench avgt 10 883048.582 ± 650952.092 ns/op {noformat} This patch passed all unit tests and integration tests on my laptop. 64 bit arithmetic operations are 50-250 times faster. 128 bit ones are 5-20 times faster. I will see the result in the integration test server. > Better Decimal vectorization > ---------------------------- > > Key: HIVE-13306 > URL: https://issues.apache.org/jira/browse/HIVE-13306 > Project: Hive > Issue Type: Bug > Components: Hive > Reporter: Matt McCline > Assignee: Teddy Choi > Priority: Critical > Attachments: HIVE-13306.1.patch, HIVE-13306.2.patch, > HIVE-13306.3.patch, HIVE-13306.4.patch > > > Decimal Vectorization Requirements > • Today, the LongColumnVector, DoubleColumnVector, BytesColumnVector, > TimestampColumnVector classes store the data as primitive Java data types > long, double, or byte arrays for efficiency. > • DecimalColumnVector is different - it has an array of Object references > to HiveDecimal objects. > • The HiveDecimal object uses an internal object BigDecimal for its > implementation. Further, BigDecimal itself uses an internal object > BigInteger for its implementation, and BigInteger uses an int array. 4 > objects total. > • And, HiveDecimal is an immutable object which means arithmetic and > other operations produce new HiveDecimal object with 3 new objects underneath. > • A major reason Vectorization is fast is the ColumnVector classes except > DecimalColumnVector do not have to allocate additional memory per row. This > avoids memory fragmentation and pressure on the Java Garbage Collector that > DecimalColumnVector can generate. It is very significant. > • What can be done with DecimalColumnVector to make it much more > efficient? > o Design several new decimal classes that allow the caller to manage the > decimal storage. > o If it takes N int values to store a decimal (e.g. N=1..5), then a new > DecimalColumnVector would have an int[] of length N*1024 (where 1024 is the > default column vector size). > o Why store a decimal in separate int values? > • Java does not support 128 bit integers. > • Java does not support unsigned integers. > • In order to do multiplication of a decimal represented in a long you > need twice the storage (i.e. 128 bits). So you need to represent parts in 32 > bit integers. > • But really since we do not have unsigned, really you can only do > multiplications on N-1 bits or 31 bits. > • So, 5 ints are needed for decimal storage... of 38 digits. > o It makes sense to have just one algorithm for decimals rather than one > for HiveDecimal and another for DecimalColumnVector. So, make HiveDecimal > store N int values, too. > o A lower level primitive decimal class would accept decimals stored as > int arrays and produces results into int arrays. It would be used by > HiveDecimal and DecimalColumnVector. -- This message was sent by Atlassian JIRA (v6.3.4#6332)