From 064595a47e3092b9a0c1cf03020733568029195e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8F=9E=E7=8F=88=E5=B1=B1=E7=9A=84=E7=8C=AB?= Date: Tue, 2 Apr 2024 17:03:47 +0800 Subject: [PATCH] index cbo rewrite --- storage/tianchi/ha_tse.cc | 6 +++--- storage/tianchi/ha_tsepart.cc | 8 ++++---- storage/tianchi/tse_cbo.cc | 6 ++---- storage/tianchi/tse_srv.h | 2 +- storage/tianchi/tse_srv_mq_stub.cc | 29 ++++++++++++----------------- 5 files changed, 22 insertions(+), 29 deletions(-) diff --git a/storage/tianchi/ha_tse.cc b/storage/tianchi/ha_tse.cc index 6819c62..f31d80e 100644 --- a/storage/tianchi/ha_tse.cc +++ b/storage/tianchi/ha_tse.cc @@ -5234,7 +5234,7 @@ int ha_tse::initialize_cbo_stats() tse_log_system("[alloc memory]normal table : %s alloc size :%lu", table->alias, calculate_size_of_cbo_stats(table)); } - m_share->cbo_stats->tse_cbo_stats_table.ndv_keys = + m_share->cbo_stats->ndv_keys = (uint32_t*)my_malloc(PSI_NOT_INSTRUMENTED, table->s->keys * sizeof(uint32_t), MYF(MY_WME)); m_share->cbo_stats->msg_len = table->s->fields * sizeof(tse_cbo_stats_column_t); @@ -5281,8 +5281,8 @@ void ha_tse::free_cbo_stats() if (user_var_set(thd, "ctc_show_alloc_cbo_stats_mem")) { tse_log_system("[free memory]normal table : %s alloc size :%lu", table->alias, calculate_size_of_cbo_stats(table)); } - my_free((m_share->cbo_stats->tse_cbo_stats_table.ndv_keys)); - m_share->cbo_stats->tse_cbo_stats_table.ndv_keys = nullptr; + my_free((m_share->cbo_stats->ndv_keys)); + m_share->cbo_stats->ndv_keys = nullptr; my_free((m_share->cbo_stats->tse_cbo_stats_table.columns)); m_share->cbo_stats->tse_cbo_stats_table.columns = nullptr; my_free((uchar *)(m_share->cbo_stats)); diff --git a/storage/tianchi/ha_tsepart.cc b/storage/tianchi/ha_tsepart.cc index 0a93cb3..c72fd82 100644 --- a/storage/tianchi/ha_tsepart.cc +++ b/storage/tianchi/ha_tsepart.cc @@ -983,9 +983,9 @@ int ha_tsepart::initialize_cbo_stats() { for (uint i = 0; i < part_num; i++) { m_part_share->cbo_stats->tse_cbo_stats_part_table[i].columns = (tse_cbo_stats_column_t*)my_malloc(PSI_NOT_INSTRUMENTED, table->s->fields * sizeof(tse_cbo_stats_column_t), MYF(MY_WME)); - m_part_share->cbo_stats->tse_cbo_stats_part_table[i].ndv_keys = - (uint32_t*)my_malloc(PSI_NOT_INSTRUMENTED, table->s->keys * sizeof(uint32_t), MYF(MY_WME)); } + m_part_share->cbo_stats->ndv_keys = + (uint32_t*)my_malloc(PSI_NOT_INSTRUMENTED, table->s->keys * sizeof(uint32_t), MYF(MY_WME)); m_part_share->cbo_stats->msg_len = table->s->fields * sizeof(tse_cbo_stats_column_t); m_part_share->cbo_stats->key_len = table->s->keys * sizeof(uint32_t); @@ -1056,9 +1056,9 @@ void ha_tsepart::free_cbo_stats() { for (uint i = 0; i < part_num; i++) { my_free(m_part_share->cbo_stats->tse_cbo_stats_part_table[i].columns); m_part_share->cbo_stats->tse_cbo_stats_part_table[i].columns = nullptr; - my_free(m_part_share->cbo_stats->tse_cbo_stats_part_table[i].ndv_keys); - m_part_share->cbo_stats->tse_cbo_stats_part_table[i].ndv_keys = nullptr; } + my_free(m_part_share->cbo_stats->ndv_keys); + m_part_share->cbo_stats->ndv_keys = nullptr; my_free(m_part_share->cbo_stats->tse_cbo_stats_part_table); m_part_share->cbo_stats->tse_cbo_stats_part_table = nullptr; my_free(m_part_share->cbo_stats); diff --git a/storage/tianchi/tse_cbo.cc b/storage/tianchi/tse_cbo.cc index 205ffaa..9ec99d2 100644 --- a/storage/tianchi/tse_cbo.cc +++ b/storage/tianchi/tse_cbo.cc @@ -443,18 +443,16 @@ void tse_index_stats_update(TABLE *table, tianchi_cbo_stats_t *cbo_stats) uint32_t estimate_rows = 0; KEY sk; - uint32_t *n_diff; + uint32_t *n_diff = cbo_stats->ndv_keys; if (is_part_table) { // set to the biggest part assert(cbo_stats->part_cnt); for (uint32 part_id = 0; part_id < cbo_stats->part_cnt; part_id++) { if (estimate_rows <= cbo_stats->tse_cbo_stats_part_table[part_id].estimate_rows) { estimate_rows = cbo_stats->tse_cbo_stats_part_table[part_id].estimate_rows; - n_diff = cbo_stats->tse_cbo_stats_part_table[part_id].ndv_keys; } } } else { - n_diff = cbo_stats->tse_cbo_stats_table.ndv_keys; estimate_rows = cbo_stats->tse_cbo_stats_table.estimate_rows; } if (estimate_rows == 0) { @@ -462,7 +460,7 @@ 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]; - if (*(n_diff+i) == 0) { + if (*(n_diff + i) == 0) { rec_per_key = static_cast(estimate_rows); } else { rec_per_key = static_cast(estimate_rows / *(n_diff+i)); diff --git a/storage/tianchi/tse_srv.h b/storage/tianchi/tse_srv.h index 1922adb..d665ded 100644 --- a/storage/tianchi/tse_srv.h +++ b/storage/tianchi/tse_srv.h @@ -144,7 +144,6 @@ typedef struct { typedef struct { uint32_t estimate_rows; tse_cbo_stats_column_t *columns; - uint32_t *ndv_keys; } tse_cbo_stats_table_t; /* @@ -160,6 +159,7 @@ typedef struct { bool is_updated; tse_cbo_stats_table_t tse_cbo_stats_table; tse_cbo_stats_table_t *tse_cbo_stats_part_table; + uint32_t *ndv_keys; } tianchi_cbo_stats_t; #pragma pack() diff --git a/storage/tianchi/tse_srv_mq_stub.cc b/storage/tianchi/tse_srv_mq_stub.cc index 4d2d98d..1caa51f 100644 --- a/storage/tianchi/tse_srv_mq_stub.cc +++ b/storage/tianchi/tse_srv_mq_stub.cc @@ -762,8 +762,7 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 void *shm_inst_4_columns = get_one_shm_inst(tch); void *shm_inst_4_keys = get_one_shm_inst(tch); void *shm_inst_4_part_table = get_one_shm_inst(tch); - tse_cbo_stats_column_t* part_columns; - uint32_t *part_ndv_keys; + tse_cbo_stats_column_t *part_columns; if (!is_part_table) { req->stats->tse_cbo_stats_table.columns = (tse_cbo_stats_column_t*)alloc_share_mem(shm_inst_4_columns, req->stats->msg_len); if (req->stats->tse_cbo_stats_table.columns == NULL) { @@ -772,8 +771,8 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } - req->stats->tse_cbo_stats_table.ndv_keys = (uint32_t*)alloc_share_mem(shm_inst_4_keys, stats->key_len); - if (req->stats->tse_cbo_stats_table.ndv_keys == NULL) { + req->stats->ndv_keys = (uint32_t *)alloc_share_mem(shm_inst_4_keys, stats->key_len); + if (req->stats->ndv_keys == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_keys, stats->key_len); free_share_mem(shm_inst_4_columns, req->stats->tse_cbo_stats_table.columns); free_share_mem(shm_inst_4_stats, req->stats); @@ -784,14 +783,14 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 req->stats->first_partid = first_partid; req->stats->num_part_fetch = num_part_fetch; req->stats->tse_cbo_stats_part_table = - (tse_cbo_stats_table_t*)alloc_share_mem(shm_inst_4_part_table, num_part_fetch * sizeof(tse_cbo_stats_table_t)); + (tse_cbo_stats_table_t *)alloc_share_mem(shm_inst_4_part_table, num_part_fetch * sizeof(tse_cbo_stats_table_t)); if (req->stats->tse_cbo_stats_part_table == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%lu)", shm_inst_4_part_table, num_part_fetch * sizeof(tse_cbo_stats_table_t)); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } - part_columns = (tse_cbo_stats_column_t*)alloc_share_mem(shm_inst_4_columns, stats->msg_len * num_part_fetch); + part_columns = (tse_cbo_stats_column_t *)alloc_share_mem(shm_inst_4_columns, stats->msg_len * num_part_fetch); if (part_columns == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_columns, stats->msg_len * num_part_fetch); free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); @@ -799,8 +798,8 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 free_share_mem(shm_inst_4_req, req); return ERR_ALLOC_MEMORY; } - part_ndv_keys = (uint32_t*)alloc_share_mem(shm_inst_4_keys, stats->key_len * num_part_fetch); - if (part_ndv_keys == NULL) { + req->stats->ndv_keys = (uint32_t *)alloc_share_mem(shm_inst_4_keys, stats->key_len); + if (req->stats->ndv_keys == NULL) { tse_log_error("alloc shm mem error, shm_inst(%p), size(%u)", shm_inst_4_keys, stats->key_len * num_part_fetch); free_share_mem(shm_inst_4_columns, part_columns); free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); @@ -810,7 +809,6 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 } for (uint i = 0; i < num_part_fetch; i++) { req->stats->tse_cbo_stats_part_table[i].columns = part_columns + i * (stats->msg_len / sizeof(tse_cbo_stats_column_t)); - req->stats->tse_cbo_stats_part_table[i].ndv_keys = part_ndv_keys + i * (stats->key_len / sizeof(uint32_t)); } } @@ -822,28 +820,25 @@ int tse_get_cbo_stats(tianchi_handler_t *tch, tianchi_cbo_stats_t *stats, uint32 if (!is_part_table) { *tch = req->tch; memcpy(stats->tse_cbo_stats_table.columns, req->stats->tse_cbo_stats_table.columns, stats->msg_len); - memcpy(stats->tse_cbo_stats_table.ndv_keys, req->stats->tse_cbo_stats_table.ndv_keys, stats->key_len); - stats->is_updated = req->stats->is_updated; stats->tse_cbo_stats_table.estimate_rows = req->stats->tse_cbo_stats_table.estimate_rows; } else { - stats->is_updated = req->stats->is_updated; for (uint i = 0; i < num_part_fetch; i++) { - stats->tse_cbo_stats_part_table[i+first_partid].estimate_rows = req->stats->tse_cbo_stats_part_table[i].estimate_rows; - memcpy(stats->tse_cbo_stats_part_table[i+first_partid].columns, req->stats->tse_cbo_stats_part_table[i].columns, stats->msg_len); - memcpy(stats->tse_cbo_stats_part_table[i+first_partid].ndv_keys, req->stats->tse_cbo_stats_part_table[i].ndv_keys, stats->key_len); + stats->tse_cbo_stats_part_table[i + first_partid].estimate_rows = req->stats->tse_cbo_stats_part_table[i].estimate_rows; + memcpy(stats->tse_cbo_stats_part_table[i + first_partid].columns, req->stats->tse_cbo_stats_part_table[i].columns, stats->msg_len); } } + stats->is_updated = req->stats->is_updated; + memcpy(stats->ndv_keys, req->stats->ndv_keys, stats->key_len); } result = req->result; } if (!is_part_table) { free_share_mem(shm_inst_4_columns, req->stats->tse_cbo_stats_table.columns); - free_share_mem(shm_inst_4_keys, req->stats->tse_cbo_stats_table.ndv_keys); } else { free_share_mem(shm_inst_4_columns, part_columns); - free_share_mem(shm_inst_4_keys, part_ndv_keys); free_share_mem(shm_inst_4_part_table, req->stats->tse_cbo_stats_part_table); } + free_share_mem(shm_inst_4_keys, req->stats->ndv_keys); free_share_mem(shm_inst_4_stats, req->stats); free_share_mem(shm_inst_4_req, req); return result; -- Gitee