MySQL 9.0.0
Source Code Documentation
rowid_ordered_retrieval_plan.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef SQL_RANGE_OPTIMIZER_ROWID_ORDERED_RETRIEVAL_PLAN_H_
25#define SQL_RANGE_OPTIMIZER_ROWID_ORDERED_RETRIEVAL_PLAN_H_
26
27#include <sys/types.h>
28
29#include "my_base.h"
30#include "sql/handler.h"
34
36class RANGE_OPT_PARAM;
37class SEL_ROOT;
38class SEL_TREE;
39struct MEM_ROOT;
40
41// TODO(sgunders): Consider whether we can create INDEX_RANGE_SCAN AccessPaths
42// directly, instead of first creating this structure and then creating
43// AccessPaths from it.
45 uint idx; ///< # of used key in param->keys
46 uint keynr; ///< # of used key in table
47 ha_rows records; ///< estimate of # records this scan will return
48
49 /** Set of intervals over key fields that will be used for row retrieval. */
51
52 /** Fields used in the query and covered by this ROR scan. */
54
55 /**
56 Cost of reading all index records with values in sel_arg intervals set
57 (assuming there is no need to access full table records)
58 */
60
61 /**
62 The ranges to scan for this index. Must be allocated on the return_mem_root.
63 */
66};
67
68// Planning related information when picking the best combination
69// of rowid ordered scans for a ROR-Intersect plan.
71 public:
72 ROR_intersect_plan(const RANGE_OPT_PARAM *param, size_t num_fields);
75
76 bool add(OverflowBitset needed_fields, ROR_SCAN_INFO *ror_scan,
77 bool is_cpk_scan, Opt_trace_object *trace_costs, bool ignore_cost);
78 double get_scan_selectivity(const ROR_SCAN_INFO *scan) const;
79 size_t num_scans() const { return m_ror_scans.size(); }
80
81 public:
82 /// Range optimizer parameter
84 /// Rowid ordered scans that are part of this plan.
86 /// Whether this plan with the chosen rowid ordered scans is covering or not.
87 bool m_is_covering{false};
88 /// Output rows for this plan.
89 double m_out_rows;
90 /// Total cost for the plan - m_index_read_cost + disk_sweep_cost
92
93 private:
94 /// Bitmap of fields covered by the scans in the plan.
96 /// Number of rows to be read from indexes that are used for rowid ordered
97 /// scans
99 /// Total cost for reading the indexes picked in the plan.
101};
102
104 TABLE *table,
105 bool index_merge_intersect_allowed,
106 SEL_TREE *tree, double cost_est,
107 bool force_index_merge_result,
108 bool reuse_handler);
109
111 const RANGE_OPT_PARAM *param,
112 Opt_trace_object *trace_object);
113
115 const RANGE_OPT_PARAM *param,
116 Opt_trace_object *trace_object);
117
119 String *key_names,
120 String *used_lengths);
121
123 String *used_lengths);
124
126
127ROR_SCAN_INFO *make_ror_scan(const RANGE_OPT_PARAM *param, int idx,
128 SEL_ROOT *sel_root, OverflowBitset needed_fields);
129
131 OverflowBitset needed_fields, MEM_ROOT *mem_root);
132
134 TABLE *table,
135 KEY_PART *used_key_part,
136 bool reuse_handler,
138
139#ifndef NDEBUG
140void dbug_dump_rowid_intersection(int indent, bool verbose,
141 const Mem_root_array<AccessPath *> &children);
142
143void dbug_dump_rowid_union(int indent, bool verbose,
144 const Mem_root_array<AccessPath *> &children);
145#endif
146
147#endif // SQL_RANGE_OPTIMIZER_ROWID_ORDERED_RETRIEVAL_PLAN_H_
A wrapper class which provides array bounds checking.
Definition: sql_array.h:47
Used to store optimizer cost estimates.
Definition: handler.h:3865
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:426
A JSON object (unordered set of key/value pairs).
Definition: opt_trace.h:802
Definition: overflow_bitset.h:78
Definition: range_opt_param.h:29
Definition: rowid_ordered_retrieval_plan.h:70
Cost_estimate m_total_cost
Total cost for the plan - m_index_read_cost + disk_sweep_cost.
Definition: rowid_ordered_retrieval_plan.h:91
double get_scan_selectivity(const ROR_SCAN_INFO *scan) const
Definition: rowid_ordered_retrieval_plan.cc:370
ROR_intersect_plan(const ROR_intersect_plan &)=delete
ha_rows m_index_records
Number of rows to be read from indexes that are used for rowid ordered scans.
Definition: rowid_ordered_retrieval_plan.h:98
OverflowBitset m_covered_fields
Bitmap of fields covered by the scans in the plan.
Definition: rowid_ordered_retrieval_plan.h:95
ROR_intersect_plan & operator=(const ROR_intersect_plan &plan)
Definition: rowid_ordered_retrieval_plan.cc:255
bool m_is_covering
Whether this plan with the chosen rowid ordered scans is covering or not.
Definition: rowid_ordered_retrieval_plan.h:87
ROR_intersect_plan(const RANGE_OPT_PARAM *param, size_t num_fields)
Definition: rowid_ordered_retrieval_plan.cc:247
double m_out_rows
Output rows for this plan.
Definition: rowid_ordered_retrieval_plan.h:89
const RANGE_OPT_PARAM * m_param
Range optimizer parameter.
Definition: rowid_ordered_retrieval_plan.h:83
bool add(OverflowBitset needed_fields, ROR_SCAN_INFO *ror_scan, bool is_cpk_scan, Opt_trace_object *trace_costs, bool ignore_cost)
Definition: rowid_ordered_retrieval_plan.cc:514
size_t num_scans() const
Definition: rowid_ordered_retrieval_plan.h:79
Cost_estimate m_index_read_cost
Total cost for reading the indexes picked in the plan.
Definition: rowid_ordered_retrieval_plan.h:100
Mem_root_array< ROR_SCAN_INFO * > m_ror_scans
Rowid ordered scans that are part of this plan.
Definition: rowid_ordered_retrieval_plan.h:85
A graph of (possible multiple) key ranges, represented as a red-black binary tree.
Definition: tree.h:68
Definition: tree.h:871
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
This file includes constants used by all storage engines.
my_off_t ha_rows
Definition: my_base.h:1141
static uint verbose
Definition: mysqlcheck.cc:66
static char * path
Definition: mysqldump.cc:149
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
OverflowBitset is a fixed-size (once allocated) bitmap that is optimized for the common case of few e...
void add_keys_and_lengths_rowid_union(const AccessPath *path, String *key_names, String *used_lengths)
Definition: rowid_ordered_retrieval_plan.cc:947
AccessPath * get_best_ror_intersect(THD *thd, const RANGE_OPT_PARAM *param, TABLE *table, bool index_merge_intersect_allowed, SEL_TREE *tree, double cost_est, bool force_index_merge_result, bool reuse_handler)
Definition: rowid_ordered_retrieval_plan.cc:680
void find_intersect_order(Mem_root_array< ROR_SCAN_INFO * > *ror_scans, OverflowBitset needed_fields, MEM_ROOT *mem_root)
Sort indexes in an order that is likely to be a good index merge intersection order.
Definition: rowid_ordered_retrieval_plan.cc:216
AccessPath * MakeRowIdOrderedIndexScanAccessPath(ROR_SCAN_INFO *scan, TABLE *table, KEY_PART *used_key_part, bool reuse_handler, MEM_ROOT *mem_root)
Definition: rowid_ordered_retrieval_plan.cc:581
void add_keys_and_lengths_rowid_intersection(const AccessPath *path, String *key_names, String *used_lengths)
Definition: rowid_ordered_retrieval_plan.cc:912
void dbug_dump_rowid_union(int indent, bool verbose, const Mem_root_array< AccessPath * > &children)
Definition: rowid_ordered_retrieval_plan.cc:972
void trace_basic_info_rowid_intersection(THD *thd, const AccessPath *path, const RANGE_OPT_PARAM *param, Opt_trace_object *trace_object)
Definition: rowid_ordered_retrieval_plan.cc:112
OverflowBitset get_needed_fields(const RANGE_OPT_PARAM *param)
Definition: rowid_ordered_retrieval_plan.cc:86
ROR_SCAN_INFO * make_ror_scan(const RANGE_OPT_PARAM *param, int idx, SEL_ROOT *sel_root, OverflowBitset needed_fields)
Definition: rowid_ordered_retrieval_plan.cc:158
void trace_basic_info_rowid_union(THD *thd, const AccessPath *path, const RANGE_OPT_PARAM *param, Opt_trace_object *trace_object)
Definition: rowid_ordered_retrieval_plan.cc:130
void dbug_dump_rowid_intersection(int indent, bool verbose, const Mem_root_array< AccessPath * > &children)
Definition: rowid_ordered_retrieval_plan.cc:962
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:213
Definition: range_optimizer.h:55
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: rowid_ordered_retrieval_plan.h:44
Cost_estimate index_read_cost
Cost of reading all index records with values in sel_arg intervals set (assuming there is no need to ...
Definition: rowid_ordered_retrieval_plan.h:59
uint keynr
Definition: rowid_ordered_retrieval_plan.h:46
SEL_ROOT * sel_root
Set of intervals over key fields that will be used for row retrieval.
Definition: rowid_ordered_retrieval_plan.h:50
uint idx
Definition: rowid_ordered_retrieval_plan.h:45
uint used_key_parts
Definition: rowid_ordered_retrieval_plan.h:65
ha_rows records
estimate of # records this scan will return
Definition: rowid_ordered_retrieval_plan.h:47
OverflowBitset covered_fields
Fields used in the query and covered by this ROR scan.
Definition: rowid_ordered_retrieval_plan.h:53
Bounds_checked_array< QUICK_RANGE * > ranges
The ranges to scan for this index.
Definition: rowid_ordered_retrieval_plan.h:64
Definition: table.h:1407