summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/plan_ranker.h
diff options
context:
space:
mode:
authorHari Khalsa <hkhalsa@10gen.com>2013-07-23 19:07:48 -0400
committerHari Khalsa <hkhalsa@10gen.com>2013-07-25 14:27:04 -0400
commitf69cfc007eed38592c879ebf9345ec70f9587aa0 (patch)
treebc2a7c39ce42ebbbaace19e644774b9253c9f774 /src/mongo/db/query/plan_ranker.h
parent50dc157e0d617b3aa9014bf47b9531e6e510912b (diff)
downloadmongo-f69cfc007eed38592c879ebf9345ec70f9587aa0.tar.gz
SERVER-10026 stage stats, multi plan runner, relevant scaffolding
Diffstat (limited to 'src/mongo/db/query/plan_ranker.h')
-rw-r--r--src/mongo/db/query/plan_ranker.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/mongo/db/query/plan_ranker.h b/src/mongo/db/query/plan_ranker.h
new file mode 100644
index 00000000000..e4a980a713d
--- /dev/null
+++ b/src/mongo/db/query/plan_ranker.h
@@ -0,0 +1,78 @@
+/**
+ * Copyright (C) 2013 10gen Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <queue>
+#include <vector>
+
+#include "mongo/db/exec/plan_stage.h"
+#include "mongo/db/exec/plan_stats.h"
+#include "mongo/db/exec/working_set.h"
+#include "mongo/db/query/query_solution.h"
+
+namespace mongo {
+
+ struct CandidatePlan;
+ struct PlanRankingDecision;
+
+ /**
+ * Ranks 2 or more plans.
+ */
+ class PlanRanker {
+ public:
+ /**
+ * Returns index in 'candidates' of which plan is best.
+ * If 'why' is not NULL, populates it with information relevant to why that plan was picked.
+ */
+ static size_t pickBestPlan(const vector<CandidatePlan>& candidates,
+ PlanRankingDecision* why);
+ private:
+ /**
+ * Assign the stats tree a 'goodness' score. Used internally.
+ */
+ static double scoreTree(const PlanStageStats& stats);
+ };
+
+ /**
+ * A container holding one to-be-ranked plan and its associated/relevant data.
+ * Does not own any of its pointers.
+ */
+ struct CandidatePlan {
+ CandidatePlan(QuerySolution* s, PlanStage* r, WorkingSet* w)
+ : solution(s), root(r), ws(w) { }
+
+ QuerySolution* solution;
+ PlanStage* root;
+ WorkingSet* ws;
+
+ // Any results produced during the plan's execution prior to ranking are retained here.
+ std::queue<WorkingSetID> results;
+ };
+
+ /**
+ * Information about why a plan was picked to be the best. Data here is placed into the cache
+ * and used by the CachedPlanRunner to compare expected performance with actual.
+ */
+ struct PlanRankingDecision {
+ // Owned by us.
+ PlanStageStats* statsOfWinner;
+
+ // TODO: We can place anything we want here. What's useful to the cache? What's useful to
+ // planning and optimization?
+ };
+
+} // namespace mongo