query_runtime/metrics/
join.rs1use std::collections::BTreeMap;
2
3use query_planning::correlation::QueryId;
4
5use super::QueryMetrics;
6
7#[derive(Debug, Clone, Default, PartialEq, Eq)]
9pub struct JoinStrategyDecisionMetrics {
10 pub(crate) query_id: Option<QueryId>,
12 pub node_id: String,
14 pub facts: BTreeMap<String, String>,
16}
17
18#[derive(Debug, Clone, Default, PartialEq, Eq)]
20pub struct JoinOperatorMetrics {
21 pub query_id: Option<QueryId>,
23 pub join_type: String,
25 pub execution_strategy: String,
27 pub key_count: usize,
29 pub residual_predicate: bool,
31 pub null_equality: String,
33 pub build_side: String,
40 pub probe_side: String,
42 pub build_rows: u64,
44 pub build_bytes: u64,
46 pub probe_rows: u64,
48 pub probe_bytes: u64,
50 pub hash_table_bytes: u64,
56 pub filtered_probe_state_bytes: u64,
58 pub mixed_size_data_bytes: u64,
60 pub gather_map_bytes: u64,
65 pub output_reservation_bytes: Option<u64>,
68 pub output_rows: u64,
70 pub output_bytes: u64,
72}
73
74impl QueryMetrics {
75 pub fn record_join_strategy_decision(&mut self, node_id: impl ToString, facts: &BTreeMap<&'static str, String>) {
77 self.join_strategy_decisions.push(JoinStrategyDecisionMetrics {
78 query_id: self.inherited_query_id(),
79 node_id: node_id.to_string(),
80 facts: facts.iter().map(|(key, value)| ((*key).to_string(), value.clone())).collect(),
81 });
82 }
83
84 pub fn record_hash_join_build(&mut self) {
86 self.hash_join_build_count = self.hash_join_build_count.saturating_add(1);
87 }
88
89 pub fn record_filtered_join_build(&mut self) {
91 self.filtered_join_build_count = self.filtered_join_build_count.saturating_add(1);
92 }
93
94 pub fn record_one_shot_join(&mut self) {
96 self.one_shot_join_count = self.one_shot_join_count.saturating_add(1);
97 }
98
99 pub fn record_hash_join_hash_table_bytes(&mut self, bytes: u64) {
101 self.hash_join_hash_table_bytes = self.hash_join_hash_table_bytes.saturating_add(bytes);
102 }
103
104 pub fn record_filtered_join_hash_table_bytes(&mut self, bytes: u64) {
106 self.filtered_join_hash_table_bytes = self.filtered_join_hash_table_bytes.saturating_add(bytes);
107 }
108
109 pub fn record_filtered_join_probe_state_bytes(&mut self, bytes: u64) {
111 self.filtered_join_probe_state_bytes = self.filtered_join_probe_state_bytes.saturating_add(bytes);
112 }
113
114 pub fn record_mixed_join_size_data_bytes(&mut self, bytes: u64) {
116 self.mixed_join_size_data_bytes = self.mixed_join_size_data_bytes.saturating_add(bytes);
117 }
118
119 pub fn record_one_shot_join_index_bytes(&mut self, bytes: u64) {
121 self.one_shot_join_index_bytes = self.one_shot_join_index_bytes.saturating_add(bytes);
122 }
123
124 pub fn record_one_shot_join_materialization_bytes(&mut self, bytes: u64) {
126 self.one_shot_join_materialization_bytes = self.one_shot_join_materialization_bytes.saturating_add(bytes);
127 }
128
129 pub fn record_one_shot_join_output_bytes(&mut self, bytes: u64) {
131 self.one_shot_join_output_bytes = self.one_shot_join_output_bytes.saturating_add(bytes);
132 }
133}