dbms: aggregate function quantileTiming: added (deterministic) randomization [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2013-10-20 03:57:28 +00:00
parent 6c1b8aadd0
commit 9a4d300a10

View File

@ -12,6 +12,8 @@
#include <DB/Columns/ColumnArray.h> #include <DB/Columns/ColumnArray.h>
#include <stats/IntHash.h>
namespace DB namespace DB
{ {
@ -136,6 +138,13 @@ namespace detail
/// Число значений для каждого значения от small_threshold до big_threshold, округлённого до big_precision. /// Число значений для каждого значения от small_threshold до big_threshold, округлённого до big_precision.
UInt64 count_big[BIG_SIZE]; UInt64 count_big[BIG_SIZE];
/// Получить значение квантиля по индексу в массиве count_big.
static inline UInt16 indexInBigToValue(size_t i)
{
return (i * BIG_PRECISION) + SMALL_THRESHOLD
+ (intHash32<0>(i) % BIG_PRECISION - (BIG_PRECISION / 2)); /// Небольшая рандомизация, чтобы не было заметно, что все значения чётные.
}
public: public:
QuantileTimingLarge() QuantileTimingLarge()
{ {
@ -209,7 +218,7 @@ namespace detail
} }
if (i < BIG_SIZE) if (i < BIG_SIZE)
return (i * BIG_PRECISION) + SMALL_THRESHOLD; return indexInBigToValue(i);
return BIG_THRESHOLD; return BIG_THRESHOLD;
} }
@ -258,7 +267,7 @@ namespace detail
if (i < BIG_SIZE) if (i < BIG_SIZE)
{ {
*result = (i * BIG_PRECISION) + SMALL_THRESHOLD; *result = indexInBigToValue(i);
++level; ++level;
++result; ++result;