From 2438e224fabd4a6f334930c7b3e639dd93ba4fb0 Mon Sep 17 00:00:00 2001 From: solid-yang Date: Tue, 21 May 2024 11:21:36 +0800 Subject: [PATCH 1/2] fix calculation of rec_per_key --- storage/tianchi/tse_cbo.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/storage/tianchi/tse_cbo.cc b/storage/tianchi/tse_cbo.cc index d6b1211..eaf20f8 100644 --- a/storage/tianchi/tse_cbo.cc +++ b/storage/tianchi/tse_cbo.cc @@ -550,11 +550,20 @@ void tse_index_stats_update(TABLE *table, tianchi_cbo_stats_t *cbo_stats) for (uint32 i = 0; i < table->s->keys; i++) { sk = table->key_info[i]; for (uint32 j = 0; j < sk.actual_key_parts; j++) { + bool all_n_diff_is_zero = true; rec_per_key = 0.0f; for (uint32 k = 0; k < table_part_num; k++) { records = cbo_stats->tse_cbo_stats_table[k].estimate_rows; if (*(n_diff + i * MAX_KEY_COLUMNS + j) > 0) { rec_per_key += static_cast(records) / static_cast(*(n_diff + i * MAX_KEY_COLUMNS + j)); + all_n_diff_is_zero = false; + } + } + + // if all n_diff(s) values 0, take records itself as rec_per_key + if (all_n_diff_is_zero) { + for (uint32 k = 0; k < table_part_num; k++) { + rec_per_key += static_cast(cbo_stats->tse_cbo_stats_table[k].estimate_rows); } } -- Gitee From f8f48eafe11072d58ff8b740ae1c53468bbd7528 Mon Sep 17 00:00:00 2001 From: solid-yang Date: Fri, 7 Jun 2024 11:15:06 +0800 Subject: [PATCH 2/2] set index stats to ignore_nulls mode --- storage/tianchi/tse_cbo.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/storage/tianchi/tse_cbo.cc b/storage/tianchi/tse_cbo.cc index eaf20f8..150295f 100644 --- a/storage/tianchi/tse_cbo.cc +++ b/storage/tianchi/tse_cbo.cc @@ -552,12 +552,21 @@ void tse_index_stats_update(TABLE *table, tianchi_cbo_stats_t *cbo_stats) for (uint32 j = 0; j < sk.actual_key_parts; j++) { bool all_n_diff_is_zero = true; rec_per_key = 0.0f; + uint32 fld_idx = sk.key_part[j].field->field_index(); for (uint32 k = 0; k < table_part_num; k++) { records = cbo_stats->tse_cbo_stats_table[k].estimate_rows; - if (*(n_diff + i * MAX_KEY_COLUMNS + j) > 0) { - rec_per_key += static_cast(records) / static_cast(*(n_diff + i * MAX_KEY_COLUMNS + j)); + uint32 n_null = cbo_stats->tse_cbo_stats_table[k].columns[fld_idx].num_null; + uint32 n_diff_part = *(n_diff + i * MAX_KEY_COLUMNS + j); + do { + if (!n_diff_part) { + break; + } else if (n_diff_part <= n_null) { + rec_per_key += 1.0f; + } else { + rec_per_key += static_cast(records - n_null) / static_cast(n_diff_part - n_null); + } all_n_diff_is_zero = false; - } + } while(0); } // if all n_diff(s) values 0, take records itself as rec_per_key -- Gitee