This commit is contained in:
Roman Peshkurov 2015-10-08 17:54:12 +03:00
commit 6c317a3e1e
11 changed files with 596 additions and 461 deletions

View File

@ -98,15 +98,15 @@ struct AggregateFunctionUniqExactData<String>
template <typename T, HyperLogLogMode mode> template <typename T, HyperLogLogMode mode>
struct BaseUniqCombinedData struct BaseUniqCombinedData
{ {
using Key = UInt64; using Key = UInt32;
using Set = CombinedCardinalityEstimator< using Set = CombinedCardinalityEstimator<
Key, Key,
HashSet<Key, DefaultHash<Key>, HashTableGrower<> >, HashSet<Key, TrivialHash, HashTableGrower<> >,
16, 16,
14, 14,
17, 17,
DefaultHash<Key>, TrivialHash,
UInt64, UInt32,
HyperLogLogBiasEstimator<UniqCombinedBiasData>, HyperLogLogBiasEstimator<UniqCombinedBiasData>,
mode mode
>; >;
@ -195,6 +195,33 @@ template <> struct AggregateFunctionUniqTraits<Float64>
} }
}; };
/** Хэш-функция для uniqCombined.
*/
template <typename T> struct AggregateFunctionUniqCombinedTraits
{
static UInt32 hash(T x) { return static_cast<UInt32>(intHash64(x)); }
};
template <> struct AggregateFunctionUniqCombinedTraits<Float32>
{
static UInt32 hash(Float32 x)
{
UInt64 res = 0;
memcpy(reinterpret_cast<char *>(&res), reinterpret_cast<char *>(&x), sizeof(x));
return static_cast<UInt32>(intHash64(res));
}
};
template <> struct AggregateFunctionUniqCombinedTraits<Float64>
{
static UInt32 hash(Float64 x)
{
UInt64 res = 0;
memcpy(reinterpret_cast<char *>(&res), reinterpret_cast<char *>(&x), sizeof(x));
return static_cast<UInt32>(intHash64(res));
}
};
/** Структура для делегации работы по добавлению одного элемента в агрегатные функции uniq. /** Структура для делегации работы по добавлению одного элемента в агрегатные функции uniq.
* Используется для частичной специализации для добавления строк. * Используется для частичной специализации для добавления строк.
*/ */
@ -204,7 +231,27 @@ struct OneAdder;
template <typename T, typename Data> template <typename T, typename Data>
struct OneAdder<T, Data, typename std::enable_if< struct OneAdder<T, Data, typename std::enable_if<
std::is_same<Data, AggregateFunctionUniqUniquesHashSetData>::value || std::is_same<Data, AggregateFunctionUniqUniquesHashSetData>::value ||
std::is_same<Data, AggregateFunctionUniqHLL12Data<T> >::value || std::is_same<Data, AggregateFunctionUniqHLL12Data<T> >::value>::type>
{
template <typename T2 = T>
static void addOne(Data & data, const IColumn & column, size_t row_num,
typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr)
{
const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num];
data.set.insert(AggregateFunctionUniqTraits<T2>::hash(value));
}
template <typename T2 = T>
static void addOne(Data & data, const IColumn & column, size_t row_num,
typename std::enable_if<std::is_same<T2, String>::value>::type * = nullptr)
{
StringRef value = column.getDataAt(row_num);
data.set.insert(CityHash64(value.data, value.size));
}
};
template <typename T, typename Data>
struct OneAdder<T, Data, typename std::enable_if<
std::is_same<Data, AggregateFunctionUniqCombinedRawData<T> >::value || std::is_same<Data, AggregateFunctionUniqCombinedRawData<T> >::value ||
std::is_same<Data, AggregateFunctionUniqCombinedLinearCountingData<T> >::value || std::is_same<Data, AggregateFunctionUniqCombinedLinearCountingData<T> >::value ||
std::is_same<Data, AggregateFunctionUniqCombinedBiasCorrectedData<T> >::value || std::is_same<Data, AggregateFunctionUniqCombinedBiasCorrectedData<T> >::value ||
@ -215,7 +262,7 @@ struct OneAdder<T, Data, typename std::enable_if<
typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr) typename std::enable_if<!std::is_same<T2, String>::value>::type * = nullptr)
{ {
const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num]; const auto & value = static_cast<const ColumnVector<T2> &>(column).getData()[row_num];
data.set.insert(AggregateFunctionUniqTraits<T2>::hash(value)); data.set.insert(AggregateFunctionUniqCombinedTraits<T2>::hash(value));
} }
template <typename T2 = T> template <typename T2 = T>

View File

@ -27,7 +27,7 @@ namespace DB
*/ */
struct UniqCombinedBiasData struct UniqCombinedBiasData
{ {
using InterpolatedData = std::array<double, 178>; using InterpolatedData = std::array<double, 200>;
static double getThreshold(); static double getThreshold();
/// Оценки количества уникальных значений по алгоритму HyperLogLog без применения каких-либо поправок. /// Оценки количества уникальных значений по алгоритму HyperLogLog без применения каких-либо поправок.

View File

@ -9,6 +9,7 @@
#include <DB/IO/ReadHelpers.h> #include <DB/IO/ReadHelpers.h>
#include <DB/IO/WriteHelpers.h> #include <DB/IO/WriteHelpers.h>
#include <DB/Core/Defines.h> #include <DB/Core/Defines.h>
#include <DB/Core/ErrorCodes.h>
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
@ -569,71 +570,54 @@ private:
} }
} }
template <HyperLogLogMode mode2 = mode> double fixRawEstimate(double raw_estimate) const
inline double fixRawEstimate(double raw_estimate,
typename std::enable_if<(mode2 == HyperLogLogMode::Raw)
|| ((mode2 == HyperLogLogMode::BiasCorrected)
&& BiasEstimator::isTrivial())>::type * = nullptr) const
{ {
return raw_estimate; if ((mode == HyperLogLogMode::Raw) || ((mode == HyperLogLogMode::BiasCorrected) && BiasEstimator::isTrivial()))
} return raw_estimate;
else if (mode == HyperLogLogMode::LinearCounting)
template <HyperLogLogMode mode2 = mode> return applyLinearCorrection(raw_estimate);
inline double fixRawEstimate(double raw_estimate, else if ((mode == HyperLogLogMode::BiasCorrected) && !BiasEstimator::isTrivial())
typename std::enable_if<(mode2 == HyperLogLogMode::LinearCounting)>::type * = nullptr) const return applyBiasCorrection(raw_estimate);
{ else if (mode == HyperLogLogMode::FullFeatured)
return applyLinearCorrection(raw_estimate);
}
template <HyperLogLogMode mode2 = mode>
inline double fixRawEstimate(double raw_estimate,
typename std::enable_if<(mode2 == HyperLogLogMode::BiasCorrected)
&& !BiasEstimator::isTrivial()>::type * = nullptr) const
{
return applyBiasCorrection(raw_estimate);
}
template <HyperLogLogMode mode2 = mode>
double fixRawEstimate(double raw_estimate,
typename std::enable_if<(mode2 == HyperLogLogMode::FullFeatured)>::type * = nullptr) const
{
static constexpr bool fix_big_cardinalities = std::is_same<HashValueType, UInt32>::value;
static constexpr double pow2_32 = 4294967296.0;
double fixed_estimate;
if (fix_big_cardinalities && (raw_estimate > (pow2_32 / 30.0)))
fixed_estimate = -pow2_32 * log(1.0 - raw_estimate / pow2_32);
else
fixed_estimate = applyCorrection(raw_estimate);
return fixed_estimate;
}
template <bool is_trivial = BiasEstimator::isTrivial()>
inline double applyCorrection(double raw_estimate, typename std::enable_if<is_trivial>::type * = nullptr) const
{
double fixed_estimate;
if (raw_estimate <= (2.5 * bucket_count))
{ {
/// Поправка в случае маленкой оценки. static constexpr bool fix_big_cardinalities = std::is_same<HashValueType, UInt32>::value;
fixed_estimate = applyLinearCorrection(raw_estimate); static constexpr double pow2_32 = 4294967296.0;
double fixed_estimate;
if (fix_big_cardinalities && (raw_estimate > (pow2_32 / 30.0)))
fixed_estimate = -pow2_32 * log(1.0 - raw_estimate / pow2_32);
else
fixed_estimate = applyCorrection(raw_estimate);
return fixed_estimate;
} }
else else
fixed_estimate = raw_estimate; throw Poco::Exception("Internal error", DB::ErrorCodes::LOGICAL_ERROR);
return fixed_estimate;
} }
template <bool is_trivial = BiasEstimator::isTrivial()> inline double applyCorrection(double raw_estimate) const
inline double applyCorrection(double raw_estimate, typename std::enable_if<!is_trivial>::type * = nullptr) const
{ {
double fixed_estimate = applyBiasCorrection(raw_estimate); double fixed_estimate;
double linear_estimate = applyLinearCorrection(fixed_estimate);
if (linear_estimate < BiasEstimator::getThreshold()) if (BiasEstimator::isTrivial())
fixed_estimate = linear_estimate; {
if (raw_estimate <= (2.5 * bucket_count))
{
/// Поправка в случае маленкой оценки.
fixed_estimate = applyLinearCorrection(raw_estimate);
}
else
fixed_estimate = raw_estimate;
}
else
{
fixed_estimate = applyBiasCorrection(raw_estimate);
double linear_estimate = applyLinearCorrection(fixed_estimate);
if (linear_estimate < BiasEstimator::getThreshold())
fixed_estimate = linear_estimate;
}
return fixed_estimate; return fixed_estimate;
} }

View File

@ -386,23 +386,16 @@ public:
throw Exception("Second argument for function '" + getName() + "' must be Set; found " + column_set_ptr->getName(), throw Exception("Second argument for function '" + getName() + "' must be Set; found " + column_set_ptr->getName(),
ErrorCodes::ILLEGAL_COLUMN); ErrorCodes::ILLEGAL_COLUMN);
/// Столбцы, которые проверяются на принадлежность множеству. Block block_of_key_columns;
ColumnNumbers left_arguments;
/// Первый аргумент может быть tuple или одиночным столбцом. /// Первый аргумент может быть tuple или одиночным столбцом.
const ColumnTuple * tuple = typeid_cast<const ColumnTuple *>(&*block.getByPosition(arguments[0]).column); const ColumnTuple * tuple = typeid_cast<const ColumnTuple *>(&*block.getByPosition(arguments[0]).column);
if (tuple) if (tuple)
{ block_of_key_columns = tuple->getData();
/// Находим в блоке столбцы из tuple.
const Block & tuple_elems = tuple->getData();
size_t tuple_size = tuple_elems.columns();
for (size_t i = 0; i < tuple_size; ++i)
left_arguments.push_back(block.getPositionByName(tuple_elems.getByPosition(i).name));
}
else else
left_arguments.push_back(arguments[0]); block_of_key_columns.insert(block.getByPosition(arguments[0]));
column_set->getData()->execute(block, left_arguments, result, negative); block.getByPosition(result).column = column_set->getData()->execute(block_of_key_columns, negative);
} }
}; };

View File

@ -288,10 +288,10 @@ public:
// Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять. // Возвращает false, если превышено какое-нибудь ограничение, и больше не нужно вставлять.
bool insertFromBlock(const Block & block, bool create_ordered_set = false); bool insertFromBlock(const Block & block, bool create_ordered_set = false);
/** Для указанных столбцов блока проверить принадлежность их значений множеству. /** Для столбцов блока проверить принадлежность их значений множеству.
* Записать результат в столбец в позиции result. * Записать результат в столбец в позиции result.
*/ */
void execute(Block & block, const ColumnNumbers & arguments, size_t result, bool negative) const; ColumnPtr execute(const Block & block, bool negative) const;
std::string describe() const std::string describe() const
{ {

View File

@ -120,7 +120,7 @@ struct Settings
M(SettingUInt64, merge_tree_max_rows_to_use_cache, (1024 * 1024)) \ M(SettingUInt64, merge_tree_max_rows_to_use_cache, (1024 * 1024)) \
\ \
/** Распределять чтение из MergeTree по потокам равномерно, обеспечивая стабильное среднее время исполнения каждого потока в пределах одного чтения. */ \ /** Распределять чтение из MergeTree по потокам равномерно, обеспечивая стабильное среднее время исполнения каждого потока в пределах одного чтения. */ \
M(SettingBool, merge_tree_uniform_read_distribution, false) \ M(SettingBool, merge_tree_uniform_read_distribution, true) \
\ \
/** Минимальная длина выражения expr = x1 OR ... expr = xN для оптимизации */ \ /** Минимальная длина выражения expr = x1 OR ... expr = xN для оптимизации */ \
M(SettingUInt64, optimize_min_equality_disjunction_chain_length, 3) \ M(SettingUInt64, optimize_min_equality_disjunction_chain_length, 3) \

View File

@ -8,373 +8,417 @@ namespace
const UniqCombinedBiasData::InterpolatedData raw_estimates = const UniqCombinedBiasData::InterpolatedData raw_estimates =
{ {
700.0 99791.8496
,3850.0 ,101386.91930000001
,7350.0 ,105450.95623333333
,10850.0 ,108128.01393333334
,14350.0 ,110851.10286666667
,89003.5714 ,113620.01383333335
,103764.30343333333 ,116434.98796666665
,105572.1915 ,119295.74893333332
,109252.46533333334 ,122202.58199999998
,112638.20573333332 ,124783.45270000001
,116094.29566666669 ,127775.84493333333
,119619.81926666666 ,130432.03390000002
,123214.92233333334 ,133122.13506666667
,126469.06656666666 ,136239.7482
,130196.15093333334 ,139004.69996666667
,133566.85673333335 ,141803.40813333335
,136991.63890000002 ,144228.62236666665
,140470.0118666667 ,147089.61343333335
,144000.91686666667 ,149984.35636666667
,147585.44463333333 ,152912.8223666667
,151222.7466 ,155449.4413666667
,154447.75893333333 ,158440.23733333332
,158181.68399999998 ,161029.4043
,161492.41386666667 ,164080.25746666666
,164840.6352 ,166720.31723333334
,168713.9904 ,169384.27826666666
,172143.82656666666 ,172521.4491666667
,175611.2078 ,175235.4233
,179116.94873333335 ,177971.46556666668
,182658.0355 ,180730.04403333334
,186236.36723333332 ,183510.69883333333
,189332.1009 ,186313.77773333332
,192976.1847 ,189138.67343333332
,196654.62706666664 ,191985.62490000002
,199835.39103333335 ,194853.55733333333
,203575.92429999998 ,197259.4243333333
,206808.87086666666 ,200165.33826666666
,210611.72886666664 ,203093.2792
,213896.25913333334 ,205550.0133666667
,217759.63066666664 ,208515.49296666667
,221096.10933333333 ,211500.27113333336
,224456.31466666667 ,214002.73933333336
,227839.0366333333 ,217022.66503333332
,231242.72576666667 ,219554.61286666666
,235239.98256666667 ,222611.62203333332
,238688.95070000002 ,225172.43516666666
,242158.17593333332 ,228261.63369999998
,245649.42926666664 ,230849.9269333333
,249158.9859666667 ,233450.9665
,252689.67179999998 ,236588.48176666666
,256241.95376666667 ,239217.14506666665
,259214.9391666667 ,241858.01729999995
,262798.3925666667 ,245040.88769999996
,266399.8345666667 ,247707.505
,270018.35863333335 ,250385.32816666667
,273653.1149 ,253072.74516666666
,276696.7119 ,255772.3767333333
,280366.51476666663 ,259026.62416666665
,284051.95540000004 ,261750.1933
,287133.5254333333 ,264484.4988666667
,290847.31173333334 ,267229.4741
,294579.5226 ,269983.9762
,297698.64109999995 ,272747.6032
,301454.39253333333 ,275521.9937
,305223.59123333334 ,278306.35263333336
,308375.3184666667 ,281100.67233333335
,312170.06 ,283902.65756666666
,315342.02996666665 ,286716.28403333336
,319162.8188666667 ,289537.95599999995
,322356.3565666666 ,292368.9353666667
,326199.5866 ,295207.7315
,329412.83396666666 ,298055.9653333333
,332634.3235666667 ,300911.9654666667
,336510.7596333333 ,303204.35336666665
,339747.7330333333 ,306077.9537333333
,343643.0385666667 ,308958.00193333335
,346896.77420000004 ,311845.22890000005
,350157.6729666667 ,314741.81600000005
,354079.3932333334 ,317644.8173333333
,357354.5196333334 ,319972.31696666667
,360638.3034333333 ,322888.63776666665
,364588.47873333335 ,325811.89053333335
,367886.05706666666 ,328741.73743333324
,371189.98006666667 ,331091.32163333334
,375161.95876666665 ,334034.29806666664
,378478.6737666666 ,336984.6469666666
,381801.6619 ,339939.86216666666
,385130.9645 ,342309.7939
,389131.7460333333 ,345278.14656666666
,392471.6233333333 ,348252.3204333333
,395817.1175 ,350635.0094666667
,399165.1003333333 ,353618.8034000001
,402518.7819333333 ,356610.7431333333
,406549.7624333333 ,359005.6872333333
,409916.016 ,362005.8481
,413289.0218666666 ,365011.9431333333
,416661.9977333333 ,367422.15616666665
,420040.4257333334 ,370439.9724666667
,424099.3186333333 ,373460.6025
,427485.4292000001 ,375879.31826666667
,430876.4814666666 ,378908.1752
,434269.4718 ,381335.98703333334
,437665.82826666674 ,384373.7107666666
,441066.7185 ,387416.2068333333
,444469.97226666665 ,389852.7087666667
,448561.9376666667 ,392901.8697
,451974.73750000005 ,395343.33469999995
,455389.1112 ,398401.5141333333
,458808.5816666667 ,400851.9174
,462230.8184666667 ,403917.6844666666
,465656.9889 ,406371.6598333334
,469081.3269 ,409440.80490000005
,472512.4878 ,412517.26203333336
,475944.4204333333 ,414981.9741666666
,480065.7132666667 ,418063.8305
,483502.04110000003 ,420530.6776
,486939.5075666667 ,423616.6512666666
,490379.7868333334 ,426088.72699999996
,493818.5365333333 ,429181.1127666666
,497259.08013333334 ,431657.64166666666
,500705.3513 ,434757.3337
,504155.6234666666 ,437235.97023333336
,507606.65499999997 ,440338.2023666667
,511060.7448666667 ,442823.12679999997
,514517.4004 ,445932.7757666667
,517973.35829999996 ,448419.81309999997
,521431.3761666666 ,451533.39386666665
,524891.7097333333 ,454026.96746666665
,529044.7593 ,457147.8259333333
,532507.0878999999 ,459643.8253666666
,535971.5070333333 ,462140.6687333334
,539436.2416999999 ,465264.5323
,542903.1470333333 ,467767.3770333333
,546370.3423 ,470899.63109999994
,549837.6947999999 ,473406.5693999999
,553307.0003666667 ,476540.8793333333
,556775.3770333333 ,479051.11850000004
,560247.6308333334 ,482189.9576
,563721.0700333334 ,484701.15849999996
,567196.7586333333 ,487836.66456666664
,570669.8439666666 ,490348.32859999995
,574146.018 ,492863.5349666667
,577622.2794666667 ,496009.21856666665
,581098.3862333334 ,498525.42956666666
,584575.8826666666 ,501674.7545333333
,588055.1468000001 ,504197.08666666667
,591538.0234 ,507345.7158333334
,595018.0103000001 ,509865.2856
,598504.5469333333 ,512385.7114666667
,601992.5697666666 ,515538.75786666665
,605475.5452 ,518061.9924333333
,608959.4645 ,521216.2575333333
,612444.0261 ,523741.7463333334
,615929.6436 ,526898.6196333334
,619412.3877333334 ,529426.4153666666
,622903.4263999999 ,531957.1346999999
,626391.3657333333 ,535122.4158
,629876.7359333333 ,537654.0189
,633364.2825999999 ,540820.3046333335
,636855.2673666667 ,543353.1055
,640344.4321000001 ,545886.3092666665
,643836.5543666667 ,549053.4182666666
,647327.3073999999 ,551588.0846666667
,650818.3525666667 ,554757.5437333334
,654312.2421666667 ,557292.4032000001
,657807.0899666668 ,559828.7957
,661301.4443666666 ,562997.8541333332
,664794.1040333334 ,565534.2980666666
,668288.1969666666 ,568709.6649999999
,671781.0196666667 ,571249.7172666666
,675272.7522333333 ,573790.0703666667
,678766.9045999999 ,576966.0044666667
,682259.3583666667 ,579505.9694666667
,685747.8148333334 ,582682.2277
,689238.7994666666 ,585223.6823
,692732.0478333334 ,587764.2020666667
,696224.6407 ,590940.0571666666
,700069.9224 ,593483.1912666665
,596026.3725
,599205.4451
,601746.4072333333
,604921.6576333332
,607463.0489333333
,610007.9545333334
,613191.4748666667
,615738.8463666667
,618922.8917333334
,621470.0042333334
,624017.6801333333
,627203.1910333333
,629749.1271666667
,632298.0367666667
,635482.3311666666
,638030.0856333333
,641214.3490333334
,643760.2273333333
,646307.8729
,649497.0210000001
,652049.6203333334
,654923.103
}; };
const UniqCombinedBiasData::InterpolatedData biases = const UniqCombinedBiasData::InterpolatedData biases =
{ {
0.0 83406.8496
,0.0 ,84682.41930000001
,0.0 ,83634.45623333333
,0.0 ,81199.51393333334
,0.0 ,78810.60286666667
,71153.5714 ,76467.51383333335
,85214.30343333333 ,74170.48796666665
,83522.1915 ,71919.24893333334
,80202.46533333334 ,69714.082
,77288.20573333332 ,67821.95270000001
,74444.29566666667 ,65702.34493333333
,71669.81926666667 ,63885.5339
,68964.92233333334 ,62102.63506666666
,66619.06656666666 ,60108.2482
,64046.15093333333 ,58400.199966666674
,61816.85673333333 ,56725.90813333334
,59641.6389 ,55317.122366666656
,57520.01186666667 ,53705.113433333325
,55450.91686666667 ,52126.856366666674
,53435.44463333334 ,50582.32236666667
,51472.74659999999 ,49284.94136666667
,49797.75893333333 ,47802.73733333333
,47931.68399999999 ,46557.904299999995
,46342.41386666667 ,45135.75746666667
,44790.6352 ,43941.817233333335
,43063.9904 ,42771.77826666667
,41593.82656666667 ,41435.949166666665
,40161.2078 ,40315.9233
,38766.94873333333 ,39217.96556666667
,37408.035500000005 ,38142.54403333333
,36086.36723333333 ,37089.19883333333
,34982.1009 ,36058.277733333336
,33726.184700000005 ,35049.17343333334
,32504.627066666664 ,34062.1249
,31485.391033333333 ,33096.05733333334
,30325.924299999995 ,32306.924333333332
,29358.870866666668 ,31378.83826666667
,28261.72886666667 ,30472.7792
,27346.259133333337 ,29734.513366666666
,26309.630666666668 ,28865.99296666667
,25446.109333333337 ,28016.77113333333
,24606.31466666666 ,27324.23933333333
,23789.036633333333 ,26510.165033333327
,22992.725766666666 ,25847.112866666674
,22089.98256666667 ,25070.122033333333
,21338.9507 ,24435.935166666663
,20608.175933333332 ,23691.133699999995
,19899.429266666673 ,23084.426933333332
,19208.985966666663 ,22490.466500000006
,18539.6718 ,21793.981766666664
,17891.95376666667 ,21227.645066666664
,17364.939166666667 ,20673.517299999996
,16748.392566666666 ,20022.387699999996
,16149.834566666666 ,19494.005
,15568.358633333331 ,18976.828166666663
,15003.114899999995 ,18469.24516666666
,14546.711900000004 ,17973.876733333327
,14016.51476666668 ,17394.124166666665
,13501.955399999997 ,16922.693300000003
,13083.52543333332 ,16461.998866666672
,12597.311733333336 ,16011.974100000001
,12129.522600000006 ,15571.476200000005
,11748.641100000008 ,15140.103200000012
,11304.392533333332 ,14719.493699999992
,10873.59123333334 ,14308.852633333338
,10525.318466666678 ,13908.172333333341
,10120.059999999998 ,13515.15756666667
,9792.029966666674 ,13133.78403333333
,9412.818866666668 ,12760.455999999986
,9106.356566666664 ,12396.435366666663
,8749.58660000001 ,12040.231499999994
,8462.833966666678 ,11693.465333333335
,8184.323566666659 ,11354.465466666676
,7860.759633333325 ,11090.853366666668
,7597.733033333323 ,10769.453733333328
,7293.038566666665 ,10454.501933333328
,7046.774200000004 ,10146.728900000007
,6807.672966666675 ,9848.316
,6529.393233333336 ,9556.31733333334
,6304.519633333344 ,9327.816966666656
,6088.30343333332 ,9049.137766666672
,5838.4787333333325 ,8777.390533333344
,5636.057066666661 ,8512.237433333328
,5439.980066666671 ,8305.821633333331
,5211.958766666658 ,8053.79806666668
,5028.673766666664 ,7809.146966666663
,4851.661899999996 ,7569.362166666669
,4680.964499999992 ,7383.2939
,4481.746033333319 ,7156.646566666673
,4321.623333333322 ,6935.8204333333315
,4167.117500000012 ,6762.50946666667
,4015.1003333333356 ,6551.303400000004
,3868.781933333337 ,6348.243133333327
,3699.762433333332 ,6187.18723333332
,3566.0159999999937 ,5992.348100000003
,3439.021866666648 ,5803.44313333333
,3311.9977333333422 ,5657.656166666672
,3190.4257333333276 ,5480.472466666678
,3049.3186333333238 ,5306.102499999989
,2935.4291999999937 ,5168.818266666669
,2826.4814666666593 ,5002.675199999988
,2719.4717999999993 ,4874.487033333319
,2615.8282666666782 ,4717.210766666666
,2516.7184999999977 ,4564.70683333333
,2419.972266666669 ,4445.208766666678
,2311.9376666666744 ,4299.36970000001
,2224.7374999999884 ,4184.834699999997
,2139.1111999999944 ,4048.0141333333354
,2058.581666666665 ,3942.4174000000057
,1980.8184666666687 ,3813.1844666666584
,1906.9888999999966 ,3711.159833333329
,1831.3268999999952 ,3585.304899999998
,1762.4878000000026 ,3466.7620333333325
,1694.420433333328 ,3375.4741666666523
,1615.7132666666682 ,3262.3304999999914
,1552.0410999999924 ,3173.1775999999954
,1489.507566666677 ,3064.151266666653
,1429.7868333333365 ,2980.226999999994
,1368.536533333332 ,2877.6127666666675
,1309.0801333333268 ,2798.141666666663
,1255.35129999999 ,2702.8336999999883
,1205.6234666666617 ,2625.4702333333166
,1156.6549999999988 ,2532.7023666666646
,1110.744866666675 ,2461.626799999998
,1067.4004000000034 ,2376.275766666678
,1023.3583000000023 ,2307.313100000019
,981.3761666666638 ,2225.89386666668
,941.7097333333513 ,2163.4674666666738
,894.7593000000148 ,2089.325933333341
,857.0879000000035 ,2029.3253666666667
,821.5070333333375 ,1970.1687333333346
,786.2416999999745 ,1899.032300000011
,753.1470333333127 ,1845.8770333333425
,720.3422999999797 ,1783.1310999999987
,687.6947999999975 ,1734.0693999999978
,657.0003666666647 ,1673.3793333333258
,625.3770333333329 ,1627.618499999992
,597.6308333333387 ,1571.457600000004
,571.0700333333225 ,1526.6585000000002
,546.7586333333165 ,1467.1645666666639
,519.8439666666478 ,1422.8285999999982
,496.0180000000012 ,1382.0349666666687
,472.2794666666693 ,1332.7185666666676
,448.386233333343 ,1292.9295666666683
,425.8826666666816 ,1247.2545333333353
,405.1468000000071 ,1213.5866666666698
,388.0233999999861 ,1167.2158333333402
,368.01030000002356 ,1130.785599999993
,354.54693333333125 ,1095.21146666667
,342.5697666666626 ,1053.2578666666716
,325.5452000000126 ,1020.4924333333329
,309.4644999999825 ,979.7575333333225
,294.0261000000173 ,949.2463333333241
,279.64360000001034 ,911.1196333333113
,262.38773333333666 ,882.9153666666631
,253.42639999999665 ,857.6347000000145
,241.36573333333945 ,827.915800000017
,226.7359333333443 ,803.5189000000051
,214.28259999999622 ,774.8046333333477
,205.26736666667662 ,751.6055000000051
,194.43210000001514 ,728.8092666666489
,186.55436666666841 ,700.9182666666651
,177.30740000001 ,679.5846666666524
,168.35256666666828 ,654.0437333333539
,162.24216666668266 ,632.9032000000007
,157.0899666666713 ,613.2956999999975
,151.44436666666297 ,587.3541333333123
,144.1040333333464 ,567.7980666666408
,138.19696666668946 ,548.164999999979
,131.01966666666945 ,532.2172666666642
,122.7522333333424 ,516.5703666666523
,116.90459999998954 ,497.5044666666848
,109.35836666667213 ,481.4694666666522
,97.81483333332774 ,462.72769999998854
,88.7994666666491 ,448.1823000000052
,82.04783333333519 ,432.7020666666601
,74.64070000000841 ,413.5571666666656
,69.92240000003949 ,400.69126666665153
,387.8724999999977
,371.94510000001173
,356.90723333331215
,337.1576333333117
,322.54893333330983
,311.4545333333469
,299.97486666667584
,291.3463666666842
,280.39173333333264
,271.5042333333404
,263.1801333333521
,253.69103333332654
,243.62716666665315
,236.53676666668616
,225.83116666666078
,217.58563333332617
,206.84903333332235
,196.72733333332386
,188.37289999997788
,182.52100000000792
,179.12033333334452
,177.1030000000028
}; };
} }
double UniqCombinedBiasData::getThreshold() double UniqCombinedBiasData::getThreshold()
{ {
return 176000; return 177700;
} }
const UniqCombinedBiasData::InterpolatedData & UniqCombinedBiasData::getRawEstimates() const UniqCombinedBiasData::InterpolatedData & UniqCombinedBiasData::getRawEstimates()

View File

@ -375,7 +375,9 @@ std::string ExpressionAction::toString() const
switch (type) switch (type)
{ {
case ADD_COLUMN: case ADD_COLUMN:
ss << "ADD " << result_name << " " << result_type->getName() << " " << added_column->getName(); ss << "ADD " << result_name << " "
<< (result_type ? result_type->getName() : "(no type)") << " "
<< (added_column ? added_column->getName() : "(no column)");
break; break;
case REMOVE_COLUMN: case REMOVE_COLUMN:
@ -387,7 +389,9 @@ std::string ExpressionAction::toString() const
break; break;
case APPLY_FUNCTION: case APPLY_FUNCTION:
ss << "FUNCTION " << result_name << " " << result_type->getName() << " = " << function->getName() << "("; ss << "FUNCTION " << result_name << " "
<< (result_type ? result_type->getName() : "(no type)") << " = "
<< (function ? function->getName() : "(no function)") << "(";
for (size_t i = 0; i < argument_names.size(); ++i) for (size_t i = 0; i < argument_names.size(); ++i)
{ {
if (i) if (i)
@ -456,9 +460,9 @@ void ExpressionActions::checkLimits(Block & block) const
std::stringstream list_of_non_const_columns; std::stringstream list_of_non_const_columns;
for (size_t i = 0, size = block.columns(); i < size; ++i) for (size_t i = 0, size = block.columns(); i < size; ++i)
if (!block.getByPosition(i).column->isConst()) if (!block.getByPosition(i).column->isConst())
list_of_non_const_columns << (i == 0 ? "" : ", ") << block.getByPosition(i).name; list_of_non_const_columns << "\n" << block.getByPosition(i).name;
throw Exception("Too many temporary non-const columns: " + list_of_non_const_columns.str() throw Exception("Too many temporary non-const columns:" + list_of_non_const_columns.str()
+ ". Maximum: " + toString(limits.max_temporary_non_const_columns), + ". Maximum: " + toString(limits.max_temporary_non_const_columns),
ErrorCodes::TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS); ErrorCodes::TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS);
} }
@ -628,8 +632,6 @@ std::string ExpressionActions::getSmallestColumn(const NamesAndTypesList & colum
void ExpressionActions::finalize(const Names & output_columns) void ExpressionActions::finalize(const Names & output_columns)
{ {
// std::cerr << "finalize\n";
NameSet final_columns; NameSet final_columns;
for (size_t i = 0; i < output_columns.size(); ++i) for (size_t i = 0; i < output_columns.size(); ++i)
{ {
@ -756,13 +758,66 @@ void ExpressionActions::finalize(const Names & output_columns)
} }
} }
for (int i = static_cast<int>(sample_block.columns()) - 1; i >= 0; --i) /* std::cerr << "\n";
for (const auto & action : actions)
std::cerr << action.toString() << "\n";
std::cerr << "\n";*/
/// Удаление ненужных временных столбцов.
/// Если у столбца после выполнения функции refcount = 0, то его можно удалить.
std::map<String, int> columns_refcount;
for (const auto & name : final_columns)
++columns_refcount[name];
for (const auto & action : actions)
{ {
const std::string & name = sample_block.getByPosition(i).name; if (!action.source_name.empty())
if (!final_columns.count(name)) ++columns_refcount[action.source_name];
add(ExpressionAction::removeColumn(name));
for (const auto & name : action.argument_names)
++columns_refcount[name];
for (const auto & name : action.prerequisite_names)
++columns_refcount[name];
} }
Actions new_actions;
new_actions.reserve(actions.size());
for (const auto & action : actions)
{
new_actions.push_back(action);
auto process = [&] (const String & name)
{
auto refcount = --columns_refcount[name];
if (refcount <= 0)
{
new_actions.push_back(ExpressionAction::removeColumn(name));
if (sample_block.has(name))
sample_block.erase(name);
}
};
if (!action.source_name.empty())
process(action.source_name);
for (const auto & name : action.argument_names)
process(name);
for (const auto & name : action.prerequisite_names)
process(name);
}
actions.swap(new_actions);
/* std::cerr << "\n";
for (const auto & action : actions)
std::cerr << action.toString() << "\n";
std::cerr << "\n";*/
optimize(); optimize();
checkLimits(sample_block); checkLimits(sample_block);
} }

View File

@ -478,12 +478,17 @@ void Set::createFromAST(DataTypes & types, ASTPtr node, const Context & context,
} }
void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result, bool negative) const ColumnPtr Set::execute(const Block & block, bool negative) const
{ {
ColumnUInt8 * c_res = new ColumnUInt8; size_t num_key_columns = block.columns();
block.getByPosition(result).column = c_res;
ColumnUInt8::Container_t & vec_res = c_res->getData(); if (0 == num_key_columns)
vec_res.resize(block.getByPosition(arguments[0]).column->size()); throw Exception("Logical error: no columns passed to Set::execute method.", ErrorCodes::LOGICAL_ERROR);
ColumnUInt8 * p_res = new ColumnUInt8;
ColumnPtr res = p_res;
ColumnUInt8::Container_t & vec_res = p_res->getData();
vec_res.resize(block.getByPosition(0).column->size());
Poco::ScopedReadRWLock lock(rwlock); Poco::ScopedReadRWLock lock(rwlock);
@ -494,19 +499,19 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
memset(&vec_res[0], 1, vec_res.size()); memset(&vec_res[0], 1, vec_res.size());
else else
memset(&vec_res[0], 0, vec_res.size()); memset(&vec_res[0], 0, vec_res.size());
return; return res;
} }
DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*block.getByPosition(arguments[0]).type); const DataTypeArray * array_type = typeid_cast<const DataTypeArray *>(&*block.getByPosition(0).type);
if (array_type) if (array_type)
{ {
if (data_types.size() != 1 || arguments.size() != 1) if (data_types.size() != 1 || num_key_columns != 1)
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH); throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
if (array_type->getNestedType()->getName() != data_types[0]->getName()) if (array_type->getNestedType()->getName() != data_types[0]->getName())
throw Exception(std::string() + "Types in section IN don't match: " + data_types[0]->getName() + " on the right, " + array_type->getNestedType()->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH); throw Exception(std::string() + "Types in section IN don't match: " + data_types[0]->getName() + " on the right, " + array_type->getNestedType()->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH);
IColumn * in_column = &*block.getByPosition(arguments[0]).column; const IColumn * in_column = &*block.getByPosition(0).column;
/// Константный столбец слева от IN поддерживается не напрямую. Для этого, он сначала материализуется. /// Константный столбец слева от IN поддерживается не напрямую. Для этого, он сначала материализуется.
ColumnPtr materialized_column; ColumnPtr materialized_column;
@ -516,24 +521,26 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
in_column = materialized_column.get(); in_column = materialized_column.get();
} }
if (ColumnArray * col = typeid_cast<ColumnArray *>(in_column)) if (const ColumnArray * col = typeid_cast<const ColumnArray *>(in_column))
executeArray(col, vec_res, negative); executeArray(col, vec_res, negative);
else else
throw Exception("Unexpected array column type: " + in_column->getName(), ErrorCodes::ILLEGAL_COLUMN); throw Exception("Unexpected array column type: " + in_column->getName(), ErrorCodes::ILLEGAL_COLUMN);
} }
else else
{ {
if (data_types.size() != arguments.size()) if (data_types.size() != num_key_columns)
throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH); throw Exception("Number of columns in section IN doesn't match.", ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);
/// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные. /// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные.
ConstColumnPlainPtrs key_columns(arguments.size()); ConstColumnPlainPtrs key_columns(num_key_columns);
for (size_t i = 0; i < arguments.size(); ++i) for (size_t i = 0; i < num_key_columns; ++i)
{ {
key_columns[i] = block.getByPosition(arguments[i]).column; key_columns[i] = block.getByPosition(i).column;
if (data_types[i]->getName() != block.getByPosition(arguments[i]).type->getName()) if (data_types[i]->getName() != block.getByPosition(i).type->getName())
throw Exception("Types of column " + toString(i + 1) + " in section IN don't match: " + data_types[i]->getName() + " on the right, " + block.getByPosition(arguments[i]).type->getName() + " on the left.", ErrorCodes::TYPE_MISMATCH); throw Exception("Types of column " + toString(i + 1) + " in section IN don't match: "
+ data_types[i]->getName() + " on the right, " + block.getByPosition(i).type->getName() + " on the left.",
ErrorCodes::TYPE_MISMATCH);
} }
/// Константные столбцы слева от IN поддерживается не напрямую. Для этого, они сначала материализуется. /// Константные столбцы слева от IN поддерживается не напрямую. Для этого, они сначала материализуется.
@ -549,6 +556,8 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
executeOrdinary(key_columns, vec_res, negative); executeOrdinary(key_columns, vec_res, negative);
} }
return res;
} }

View File

@ -0,0 +1,2 @@
SET max_temporary_non_const_columns = 10;
SELECT number + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 AS x FROM system.numbers LIMIT 1;