学堂 学堂 学堂公众号手机端

2022-08-26 mysql/stonedb-维度表初始化

lewis 5年前 (2020-01-24) 阅读数 8 #技术


摘要:

记录维度表初始化

调用堆栈:
(gdb) bt
#0 Tianmu::core::DimensionGroupMaterialized::NewDimensionContent (this=0x7f10ac11f2b0, dim=0, tnew=0x7f108edbb470, nulls=false)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/dimension_group.cpp:126
#1 0x00000000031534a0 in Tianmu::core::MINewContents::Commit (this=0x7f34344b33a0, joined_tuples=7422784)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/mi_new_contents.cpp:218
#2 0x000000000313ffe5 in Tianmu::core::JoinerMapped::ExecuteJoinConditions (this=0x7f10ac127f00, cond=...)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/joiner_mapped.cpp:190
#3 0x00000000030ad9e7 in Tianmu::core::ParameterizedFilter::UpdateJoinCondition (this=0x7f10ac11efd0, cond=..., tips=...)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/parameterized_filter.cpp:614
#4 0x00000000030b158f in Tianmu::core::ParameterizedFilter::UpdateMultiIndex (this=0x7f10ac11efd0, count_only=false, limit=-1)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/parameterized_filter.cpp:1221
#5 0x0000000002d6daab in Tianmu::core::Query::Preexecute (this=0x7f34344b4800, qu=..., sender=0x7f10ac11ed90, display_now=true)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/query.cpp:777
#6 0x0000000002d3f2e2 in Tianmu::core::Engine::Execute (this=0x7f7a6f0, thd=0x7f10ac000030, lex=0x7f10ac002358, result_output=0x7f10c000e4f0, unit_for_union=0x0)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/engine_execute.cpp:421
#7 0x0000000002d3e596 in Tianmu::core::Engine::HandleSelect (this=0x7f7a6f0, thd=0x7f10ac000030, lex=0x7f10ac002358, result=@0x7f34344b4d18: 0x7f10c000e4f0, setup_tables_done_option=0,
res=@0x7f34344b4d14: 0, optimize_after_tianmu=@0x7f34344b4d0c: 1, tianmu_free_join=@0x7f34344b4d10: 1, with_insert=0)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/core/engine_execute.cpp:232
#8 0x0000000002e26eef in Tianmu::dbhandler::TIANMU_HandleSelect (thd=0x7f10ac000030, lex=0x7f10ac002358, result=@0x7f34344b4d18: 0x7f10c000e4f0, setup_tables_done_option=0,
res=@0x7f34344b4d14: 0, optimize_after_tianmu=@0x7f34344b4d0c: 1, tianmu_free_join=@0x7f34344b4d10: 1, with_insert=0)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/tianmu/handler/ha_rcengine.cpp:82
#9 0x0000000002467f1a in execute_sqlcom_select (thd=0x7f10ac000030, all_tables=0x7f10c000b2c8) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/sql_parse.cc:5182
#10 0x000000000246129e in mysql_execute_command (thd=0x7f10ac000030, first_level=true) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/sql_parse.cc:2831
#11 0x0000000002468ee3 in mysql_parse (thd=0x7f10ac000030, parser_state=0x7f34344b5eb0) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/sql_parse.cc:5621
#12 0x000000000245e17b in dispatch_command (thd=0x7f10ac000030, com_data=0x7f34344b6650, command=COM_QUERY)
at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/sql_parse.cc:1495
#13 0x000000000245d0a7 in do_command (thd=0x7f10ac000030) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/sql_parse.cc:1034
#14 0x000000000258fcad in handle_connection (arg=0xb466fa0) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/sql/conn_handler/connection_handler_per_thread.cc:313
#15 0x0000000002c760e2 in pfs_spawn_thread (arg=0x15b31df0) at /home/jenkins/workspace/stonedb5.7-zsl-centos7.9-30-119-20220805/storage/perfschema/pfs.cc:2197
#16 0x00007f343db78ea5 in start_thread () from /lib64/libpthread.so.0
#17 0x00007f343bdadb0d in clone () from /lib64/libc.so.6
核心函数:MINewContents::Commit
void MINewContents::Commit([[maybe_unused]] int64_t joined_tuples)  // commit changes to multiindex - must be called
// at the end, or changes will be lost
{
MEASURE_FET("MINewContents::Commit(...)");
std::vector<int> no_locks(no_dims);
for (int dim = 0; dim < no_dims; dim++)
if (dim_involved[dim]) {
no_locks[dim] = mind->group_for_dim[dim]->NumOfLocks(dim);
}

// dim_involved contains full original groups (to be deleted)
for (int dim = 0; dim < no_dims; dim++)
if (dim_involved[dim]) {
int group_no = mind->group_num_for_dim[dim];
if (mind->dim_groups[group_no]) { // otherwise already deleted
delete mind->dim_groups[group_no];
mind->dim_groups[group_no] = NULL;
}
}

if (f_opt) f_opt->Commit();
// Now all involved groups must be replaced by a new contents

if (content_type == enumMINCType::MCT_FILTER_FORGET) { // optimized version: just exchange filters
DimensionGroupFilter *nf =
new DimensionGroupFilter(optimized_dim_stay, f_opt, 2,
pack_power); // mode 2: pass Filter ownership to the DimensionGroup
f_opt = NULL;
nf->Lock(optimized_dim_stay, no_locks[optimized_dim_stay]);
mind->dim_groups.push_back(nf);
DimensionVector dims_to_forget(dim_involved);
dims_to_forget[optimized_dim_stay] = false;
DimensionGroupMaterialized *ng = new DimensionGroupMaterialized(dims_to_forget); // forgotten dimensions
mind->dim_groups.push_back(ng);
ng->SetNumOfObj(1); // set a dummy size 1 for a group containing forgotten
// dimensions only
} else if (content_type == enumMINCType::MCT_VIRTUAL_DIM) { // optimized version: virtual dimension group
DimensionGroupVirtual *nv = new DimensionGroupVirtual(dim_involved, optimized_dim_stay, f_opt,
2); // mode 2: pass Filter ownership to the DimensionGroup
f_opt = NULL;
nv->Lock(optimized_dim_stay, no_locks[optimized_dim_stay]);
mind->dim_groups.push_back(nv);
for (int dim = 0; dim < no_dims; dim++) {
if (dim_involved[dim] && !forget_now[dim] && dim != optimized_dim_stay) {
t_new[dim]->SetNumOfLocks(no_locks[dim]);
nv->NewDimensionContent(dim, t_new[dim], nulls_possible[dim]);
t_new[dim] = NULL; // ownership transferred to the DimensionGroup
}
}
} else {
// now we should exchange existing joined dimensions into the newly
// calculated ones
if (roughsorter) {
roughsorter->Commit(obj); // sort roughly the current t_new contents, if needed
roughsorter->Barrier();
}

DimensionGroupMaterialized *ng = new DimensionGroupMaterialized(dim_involved); // involving also forgotten
mind->dim_groups.push_back(ng);
ng->SetNumOfObj(obj);
for (int dim = 0; dim < no_dims; dim++) {
if (dim_involved[dim] && !forget_now[dim]) {
t_new[dim]->SetNumOfLocks(no_locks[dim]);
ng->NewDimensionContent(dim, t_new[dim], nulls_possible[dim]);
t_new[dim] = NULL; // ownership transferred to the DimensionGroup
}
}
}
mind->FillGroupForDim();
mind->UpdateNumOfTuples();
for (int dim = 0; dim < no_dims; dim++)
if (dim_involved[dim] && !forget_now[dim]) mind->UnlockFromGetIndex(dim);
}

关键点:


// now we should exchange existing joined dimensions into the newly
// calculated ones
if (roughsorter) {
roughsorter->Commit(obj); // sort roughly the current t_new contents, if needed
roughsorter->Barrier();
}

DimensionGroupMaterialized *ng = new DimensionGroupMaterialized(dim_involved); // involving also forgotten
mind->dim_groups.push_back(ng);
ng->SetNumOfObj(obj);
for (int dim = 0; dim < no_dims; dim++) {
if (dim_involved[dim] && !forget_now[dim]) {
t_new[dim]->SetNumOfLocks(no_locks[dim]);
ng->NewDimensionContent(dim, t_new[dim], nulls_possible[dim]);
t_new[dim] = NULL; // ownership transferred to the DimensionGroup
}
}
DimensionGroupMaterialized::NewDimensionContent
void DimensionGroupMaterialized::NewDimensionContent(int dim, IndexTable *tnew,
bool nulls) // tnew will be added (as a pointer to be deleted by
// destructor) on a dimension dim
{
DEBUG_ASSERT(dims_used[dim]);
delete t[dim];
t[dim] = tnew;
nulls_possible[dim] = nulls;
}
版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门