Repository: incubator-quickstep Updated Branches: refs/heads/estimate-num-distinct-values a12ee48a9 -> 19b68cd52
Updates Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/19b68cd5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/19b68cd5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/19b68cd5 Branch: refs/heads/estimate-num-distinct-values Commit: 19b68cd522bb8fb2b2b63d1198b62462a9d9a8d5 Parents: a12ee48 Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Tue Oct 4 16:45:12 2016 -0500 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Tue Oct 4 16:45:12 2016 -0500 ---------------------------------------------------------------------- .../cost_model/StarSchemaSimpleCostModel.cpp | 28 +++++++++++++------- .../cost_model/StarSchemaSimpleCostModel.hpp | 8 ++++++ 2 files changed, 27 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/19b68cd5/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp ---------------------------------------------------------------------- diff --git a/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp b/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp index 019c5ed..8d254fa 100644 --- a/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp +++ b/query_optimizer/cost_model/StarSchemaSimpleCostModel.cpp @@ -149,18 +149,32 @@ std::size_t StarSchemaSimpleCostModel::estimateCardinalityForNestedLoopsJoin( std::size_t StarSchemaSimpleCostModel::estimateCardinalityForAggregate( const P::AggregatePtr &physical_plan) { - if (physical_plan->grouping_expressions().empty()) { - return 1; + double filter_selectivity = + estimateSelectivityForPredicate(physical_plan->filter_predicate(), physical_plan); + return static_cast<std::size_t>( + estimateNumGroupsForAggregate(physical_plan) * filter_selectivity); +} + +std::size_t StarSchemaSimpleCostModel::estimateCardinalityForWindowAggregate( + const P::WindowAggregatePtr &physical_plan) { + return estimateCardinality(physical_plan->input()); +} + + +std::size_t StarSchemaSimpleCostModel::estimateNumGroupsForAggregate( + const physical::AggregatePtr &aggregate) { + if (aggregate->grouping_expressions().empty()) { + return 1uL; } - std::size_t estimated_child_cardinality = estimateCardinality(physical_plan->input()); + std::size_t estimated_child_cardinality = estimateCardinality(aggregate->input()); std::size_t estimated_num_groups = 1; std::size_t max_attr_num_distinct_values = 0; - for (const auto &expr : physical_plan->grouping_expressions()) { + for (const auto &expr : aggregate->grouping_expressions()) { E::AttributeReferencePtr attr; if (E::SomeAttributeReference::MatchesWithConditionalCast(expr, &attr)) { std::size_t attr_num_distinct_values = - estimateNumDistinctValues(attr->id(), physical_plan->input()); + estimateNumDistinctValues(attr->id(), aggregate->input()); estimated_num_groups *= std::max(1uL, attr_num_distinct_values); max_attr_num_distinct_values = std::max(max_attr_num_distinct_values, attr_num_distinct_values); @@ -175,10 +189,6 @@ std::size_t StarSchemaSimpleCostModel::estimateCardinalityForAggregate( return estimated_num_groups; } -std::size_t StarSchemaSimpleCostModel::estimateCardinalityForWindowAggregate( - const P::WindowAggregatePtr &physical_plan) { - return estimateCardinality(physical_plan->input()); -} std::size_t StarSchemaSimpleCostModel::estimateNumDistinctValues( const expressions::ExprId attribute_id, http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/19b68cd5/query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp ---------------------------------------------------------------------- diff --git a/query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp b/query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp index d752065..662b118 100644 --- a/query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp +++ b/query_optimizer/cost_model/StarSchemaSimpleCostModel.hpp @@ -67,6 +67,14 @@ class StarSchemaSimpleCostModel : public CostModel { const physical::PhysicalPtr &physical_plan) override; /** + * @brief Estimate the number of groups in an aggregation. + * + * @param aggregate The physical plan of the aggregation. + * @return The estimated number of groups. + */ + std::size_t estimateNumGroupsForAggregate(const physical::AggregatePtr &aggregate); + + /** * @brief Estimate the number of distinct values of an attribute in a relation. * * @param attribute_id The expression id of the target attribute.