diff --git a/deps/oblib/src/lib/container/ob_array.h b/deps/oblib/src/lib/container/ob_array.h index 9f4851001a..db9335de9f 100644 --- a/deps/oblib/src/lib/container/ob_array.h +++ b/deps/oblib/src/lib/container/ob_array.h @@ -98,6 +98,7 @@ public: virtual ~ObArrayImpl() __attribute__((noinline)); inline void set_label(const lib::ObLabel &label) { block_allocator_.set_label(label); } inline void set_attr(const lib::ObMemAttr &attr) { block_allocator_.set_attr(attr); } + inline void set_tenant_id(const uint64_t &tenant_id) { block_allocator_.set_tenant_id(tenant_id); } inline void set_block_size(const int64_t block_size) { block_size_ = block_size; } inline int64_t get_block_size() const {return block_size_; } inline void set_block_allocator(const BlockAllocatorT &alloc) { block_allocator_ = alloc; } diff --git a/src/sql/engine/join/ob_basic_nested_loop_join_op.cpp b/src/sql/engine/join/ob_basic_nested_loop_join_op.cpp index 271010b130..4e88b72d02 100644 --- a/src/sql/engine/join/ob_basic_nested_loop_join_op.cpp +++ b/src/sql/engine/join/ob_basic_nested_loop_join_op.cpp @@ -77,7 +77,7 @@ int ObBasicNestedLoopJoinOp::prepare_rescan_params(bool is_group) ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); CK(OB_NOT_NULL(plan_ctx)); ObObjParam *param = NULL; - common::ObSEArray params; + sql::ObTMArray params; common::ObSArray param_idxs; common::ObSArray param_expr_idxs; ObBatchRescanCtl *batch_rescan_ctl = (get_spec().enable_px_batch_rescan_ && is_group) diff --git a/src/sql/engine/ob_operator.cpp b/src/sql/engine/ob_operator.cpp index 16dffbbf58..00fd864f21 100644 --- a/src/sql/engine/ob_operator.cpp +++ b/src/sql/engine/ob_operator.cpp @@ -1615,7 +1615,7 @@ int ObBatchRescanParams::deep_copy_param(const common::ObObjParam &org_param, } int ObBatchRescanParams::append_batch_rescan_param(const ObIArray ¶m_idxs, - const ObSEArray &res_objs) + const ObTMArray &res_objs) { int ret = OB_SUCCESS; if (OB_FAIL(params_.push_back(res_objs))) { @@ -1632,7 +1632,7 @@ int ObBatchRescanParams::append_batch_rescan_param(const ObIArray ¶ } int ObBatchRescanParams::append_batch_rescan_param(const ObIArray ¶m_idxs, - const ObSEArray &res_objs, + const ObTMArray &res_objs, const common::ObIArray ¶m_expr_idxs) { int ret = OB_SUCCESS; diff --git a/src/sql/engine/ob_operator.h b/src/sql/engine/ob_operator.h index e6a01d2fc6..6fd0af7c0f 100644 --- a/src/sql/engine/ob_operator.h +++ b/src/sql/engine/ob_operator.h @@ -108,9 +108,9 @@ public: return param_idxs_.at(idx); } int append_batch_rescan_param(const common::ObIArray ¶m_idxs, - const common::ObSEArray &res_objs); + const sql::ObTMArray &res_objs); int append_batch_rescan_param(const common::ObIArray ¶m_idxs, - const common::ObSEArray &res_objs, + const sql::ObTMArray &res_objs, const common::ObIArray ¶m_expr_idxs); void reset() { @@ -132,7 +132,7 @@ public: int deep_copy_param(const common::ObObjParam &org_param, common::ObObjParam &new_param); public: common::ObArenaAllocator allocator_; - common::ObSArray> params_; + common::ObSArray> params_; common::ObSEArray param_idxs_; common::ObSEArray param_expr_idxs_; TO_STRING_KV(K(param_idxs_), K(params_), K_(param_expr_idxs)); diff --git a/src/sql/engine/subquery/ob_subplan_filter_op.h b/src/sql/engine/subquery/ob_subplan_filter_op.h index b22d612939..ac65723ad3 100644 --- a/src/sql/engine/subquery/ob_subplan_filter_op.h +++ b/src/sql/engine/subquery/ob_subplan_filter_op.h @@ -16,6 +16,7 @@ #include "sql/engine/ob_operator.h" #include "sql/engine/basic/ob_chunk_datum_store.h" #include "sql/engine/px/ob_px_util.h" +#include "sql/ob_sql_define.h" namespace oceanbase { @@ -271,7 +272,7 @@ private: ObBatchRescanParams rescan_batch_params_; int64_t left_row_idx_; ObBatchRescanCtl batch_rescan_ctl_; - common::ObSEArray cur_params_; + sql::ObTMArray cur_params_; common::ObSArray cur_param_idxs_; common::ObSArray cur_param_expr_idxs_; common::ObSEArray subplan_iters_to_check_; diff --git a/src/sql/executor/ob_slice_calc.h b/src/sql/executor/ob_slice_calc.h index 94750507f1..45f1baa17f 100644 --- a/src/sql/executor/ob_slice_calc.h +++ b/src/sql/executor/ob_slice_calc.h @@ -324,7 +324,7 @@ protected: virtual int destroy() override; protected: // 存储同一个partition所对应的所有task id - typedef common::ObSEArray TaskIdxArray; + typedef sql::ObTMArray TaskIdxArray; // pkey random情况下:数据可以发送到对应partition所在的SQC的任意一个task上,因此每一个partition都对应着 // 一组task id // key: tablet_id diff --git a/src/sql/ob_sql_define.h b/src/sql/ob_sql_define.h index e003319ded..82ad4cc02d 100644 --- a/src/sql/ob_sql_define.h +++ b/src/sql/ob_sql_define.h @@ -17,6 +17,8 @@ #include "share/datum/ob_datum.h" #include "common/object/ob_object.h" #include "share/ob_define.h" +#include "deps/oblib/src/lib/container/ob_array.h" +#include "src/share/rc/ob_tenant_base.h" namespace oceanbase { @@ -28,6 +30,7 @@ struct ObSchemaObjVersion; } } using namespace common; + namespace sql { const int64_t OB_SQL_MAX_CHILD_OPERATOR_NUM = 16; @@ -632,6 +635,28 @@ struct ObWinfuncOptimizationOpt }; }; +// class full name: ob tenant memory array. +// Used to solve the following problem: +// the initial memory allocation of ObSEArray is relatively large, leading to memory inflation issues in some scenarios. +// Default to using the MTL_ID() tenant, +// and the lifecycle of this class cannot cross tenants. +template, typename ItemEncode = DefaultItemEncode > +class ObTMArray final : public ObArrayImpl +{ +public: + using ObArrayImpl::ObArrayImpl; + ObTMArray(int64_t block_size = std::min(static_cast(4 * sizeof(T)), OB_MALLOC_NORMAL_BLOCK_SIZE), + const BlockAllocatorT &alloc = BlockAllocatorT("TMArray")); +}; + +template +ObTMArray::ObTMArray(int64_t block_size, + const BlockAllocatorT &alloc) + : ObArrayImpl(block_size, alloc) +{ + this->set_tenant_id(MTL_ID()); +} + } // namespace sql } // namespace oceanbase #endif /* OCEANBASE_SQL_OB_SQL_DEFINE_H_ */