summaryrefslogtreecommitdiff
path: root/sql/sql_analyze_stmt.h
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2016-03-28 12:02:56 +0300
committerSergei Petrunia <psergey@askmonty.org>2016-03-28 12:02:56 +0300
commit44fdb56c977259b2801c612116813beda403df78 (patch)
treee4fb8f41f72bb5d9022648bedc4513c9d09bd5ec /sql/sql_analyze_stmt.h
parent24cd633fd856d0ca7e4149b49cb7eb3b4c890601 (diff)
downloadmariadb-git-44fdb56c977259b2801c612116813beda403df78.tar.gz
MDEV-8646: Re-engineer the code for post-join operations
- Make EXPLAIN code use the post-join operations - Remove Sort_and_group_tracker that was used for that purpose
Diffstat (limited to 'sql/sql_analyze_stmt.h')
-rw-r--r--sql/sql_analyze_stmt.h171
1 files changed, 0 insertions, 171 deletions
diff --git a/sql/sql_analyze_stmt.h b/sql/sql_analyze_stmt.h
index d7634bdfb85..2a08a842dfc 100644
--- a/sql/sql_analyze_stmt.h
+++ b/sql/sql_analyze_stmt.h
@@ -284,174 +284,3 @@ private:
ulonglong sort_buffer_size;
};
-
-typedef enum
-{
- EXPL_NO_TMP_TABLE=0,
- EXPL_TMP_TABLE_BUFFER,
- EXPL_TMP_TABLE_GROUP,
- EXPL_TMP_TABLE_DISTINCT
-} enum_tmp_table_use;
-
-
-typedef enum
-{
- EXPL_ACTION_EOF, /* not-an-action */
- EXPL_ACTION_FILESORT,
- EXPL_ACTION_TEMPTABLE,
- EXPL_ACTION_REMOVE_DUPS,
-} enum_qep_action;
-
-
-/*
- This is to track how a JOIN object has resolved ORDER/GROUP BY/DISTINCT
-
- We are not tied to the query plan at all, because query plan does not have
- sufficient information. *A lot* of decisions about ordering/grouping are
- made at very late stages (in JOIN::exec, JOIN::init_execution, in
- create_sort_index and even in create_tmp_table).
-
- The idea is that operations that happen during select execution will report
- themselves. We have these operations:
- - Sorting with filesort()
- - Duplicate row removal (the one done by remove_duplicates()).
- - Use of temporary table to buffer the result.
-
- There is also "Selection" operation, done by do_select(). It reads rows,
- there are several distinct cases:
- 1. doing the join operation on the base tables
- 2. reading the temporary table
- 3. reading the filesort output
- it would be nice to build execution graph, e.g.
-
- Select(JOIN op) -> temp.table -> filesort -> Select(filesort result)
-
- the problem is that there is no way to tell what a do_select() call will do.
-
- Our solution is not to have explicit selection operations. We make these
- assumptions about the query plan:
- - Select(JOIN op) is the first operation in the query plan
- - Unless the first recorded operation is filesort(). filesort() is unable
- read result of a select, so when we find it first, the query plan is:
-
- filesort(first join table) -> Select(JOIN op) -> ...
-
- the other popular query plan is:
-
- Select (JOIN op) -> temp.table -> filesort() -> ...
-
-///TODO: handle repeated execution with subselects!
-*/
-
-class Sort_and_group_tracker : public Sql_alloc
-{
- enum { MAX_QEP_ACTIONS = 5 };
-
- /* Query actions in the order they were made. */
- enum_qep_action qep_actions[MAX_QEP_ACTIONS];
-
- /* Number for the next action */
- int cur_action;
-
- /*
- Non-zero means there was already an execution which had
- #total_actions actions
- */
- int total_actions;
-
- int get_n_actions()
- {
- return total_actions? total_actions: cur_action;
- }
-
- /*
- TRUE<=>there were executions which took different sort/buffer/de-duplicate
- routes. The counter values are not meaningful.
- */
- bool varied_executions;
-
- /* Details about query actions */
- union
- {
- Filesort_tracker *filesort_tracker;
- enum_tmp_table_use tmp_table;
- }
- qep_actions_data[MAX_QEP_ACTIONS];
-
- Filesort_tracker *dummy_fsort_tracker;
- bool is_analyze;
-public:
- Sort_and_group_tracker(bool is_analyze_arg) :
- cur_action(0), total_actions(0), varied_executions(false),
- dummy_fsort_tracker(NULL),
- is_analyze(is_analyze_arg)
- {}
-
- /*************** Reporting interface ***************/
- /* Report that join execution is started */
- void report_join_start()
- {
- if (!total_actions && cur_action != 0)
- {
- /* This is a second execution */
- total_actions= cur_action;
- }
- cur_action= 0;
- }
-
- /*
- Report that a temporary table is created. The next step is to write to the
- this tmp. table
- */
- void report_tmp_table(TABLE *tbl);
-
- /*
- Report that we are doing a filesort.
- @return
- Tracker object to be used with filesort
- */
- Filesort_tracker *report_sorting(THD *thd);
-
- /*
- Report that remove_duplicates() is invoked [on a temp. table].
- We don't collect any statistics on this operation, yet.
- */
- void report_duplicate_removal();
-
- friend class Iterator;
- /*************** Statistics retrieval interface ***************/
- bool had_varied_executions() { return varied_executions; }
-
- class Iterator
- {
- Sort_and_group_tracker *owner;
- int idx;
- public:
- Iterator(Sort_and_group_tracker *owner_arg) :
- owner(owner_arg), idx(owner_arg->get_n_actions() - 1)
- {}
-
- enum_qep_action get_next(Filesort_tracker **tracker/*,
- enum_tmp_table_use *tmp_table_use*/)
- {
- /* Walk back through the array... */
- if (idx < 0)
- return EXPL_ACTION_EOF;
- switch (owner->qep_actions[idx])
- {
- case EXPL_ACTION_FILESORT:
- *tracker= owner->qep_actions_data[idx].filesort_tracker;
- break;
- case EXPL_ACTION_TEMPTABLE:
- //*tmp_table_use= tmp_table_kind[tmp_table_idx++];
- break;
- default:
- break;
- }
- return owner->qep_actions[idx--];
- }
-
- bool is_last_element() { return idx == -1; }
- };
-};
-