This is an automated email from the ASF dual-hosted git repository. reshke pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 68ad57743689d93d59a1e3736ceb0cccdb2b91be Author: Chris Hajas <[email protected]> AuthorDate: Tue Sep 12 09:43:46 2023 -0700 Optimize serialization of IMDId objects in Orca to be lazy (#16339) This is a follow up to commit b90e0e5, which optimized many objects to do their serialization only when needed. This commit modifies the rest of the objects. This serialization is primarily used when there is an error, so there's no need to serialize it in the vast majority of cases. This improves optimization time when loading objects into the relcache by 11%, and for queries when the relcache is already populated by 6% in a complex sample query involving large and wide partition tables. --- .../libnaucrates/include/naucrates/md/CMDIdCast.h | 4 ++-- .../libnaucrates/include/naucrates/md/CMDIdColStats.h | 4 ++-- .../libnaucrates/include/naucrates/md/CMDIdGPDB.h | 4 ++-- .../libnaucrates/include/naucrates/md/CMDIdRelStats.h | 4 ++-- .../libnaucrates/include/naucrates/md/CMDIdScCmp.h | 4 ++-- src/backend/gporca/libnaucrates/src/md/CMDIdCast.cpp | 15 ++++++++++----- .../gporca/libnaucrates/src/md/CMDIdColStats.cpp | 15 ++++++++++----- src/backend/gporca/libnaucrates/src/md/CMDIdGPDB.cpp | 19 ++++++++++--------- .../gporca/libnaucrates/src/md/CMDIdGPDBCtas.cpp | 2 -- .../gporca/libnaucrates/src/md/CMDIdRelStats.cpp | 14 ++++++++++---- src/backend/gporca/libnaucrates/src/md/CMDIdScCmp.cpp | 13 ++++++++----- 11 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdCast.h b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdCast.h index 17d7e3327c..39ff2d6077 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdCast.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdCast.h @@ -47,10 +47,10 @@ private: WCHAR m_mdid_buffer[GPDXL_MDID_LENGTH]; // string representation of the mdid - CWStringStatic m_str; + mutable CWStringStatic m_str; // serialize mdid - void Serialize(); + void Serialize() const; public: CMDIdCast(const CMDIdCast &) = delete; diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdColStats.h b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdColStats.h index f08ec58a6a..becefaa620 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdColStats.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdColStats.h @@ -48,10 +48,10 @@ private: WCHAR m_mdid_buffer[GPDXL_MDID_LENGTH]; // string representation of the mdid - CWStringStatic m_str; + mutable CWStringStatic m_str; // serialize mdid - void Serialize(); + void Serialize() const; public: CMDIdColStats(const CMDIdColStats &) = delete; diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdGPDB.h b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdGPDB.h index 4ca0e6b439..785815c108 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdGPDB.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdGPDB.h @@ -58,10 +58,10 @@ protected: WCHAR m_mdid_array[GPDXL_MDID_LENGTH]; // string representation of the mdid - CWStringStatic m_str; + mutable CWStringStatic m_str; // serialize mdid - virtual void Serialize(); + virtual void Serialize() const; public: // ctors diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdRelStats.h b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdRelStats.h index ed0237e052..0fcd9a140a 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdRelStats.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdRelStats.h @@ -45,10 +45,10 @@ private: WCHAR m_mdid_array[GPDXL_MDID_LENGTH]; // string representation of the mdid - CWStringStatic m_str; + mutable CWStringStatic m_str; // serialize mdid - void Serialize(); + void Serialize() const; public: CMDIdRelStats(const CMDIdRelStats &) = delete; diff --git a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdScCmp.h b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdScCmp.h index 99b325a470..5dfa8fec79 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdScCmp.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/md/CMDIdScCmp.h @@ -46,10 +46,10 @@ private: WCHAR m_mdid_array[GPDXL_MDID_LENGTH]; // string representation of the mdid - CWStringStatic m_str; + mutable CWStringStatic m_str; // serialize mdid - void Serialize(); + void Serialize() const; public: CMDIdScCmp(const CMDIdScCmp &) = delete; diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdCast.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdCast.cpp index d568347083..e16beffb09 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdCast.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdCast.cpp @@ -32,9 +32,6 @@ CMDIdCast::CMDIdCast(CMDIdGPDB *mdid_src, CMDIdGPDB *mdid_dest) { GPOS_ASSERT(mdid_src->IsValid()); GPOS_ASSERT(mdid_dest->IsValid()); - - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -60,8 +57,14 @@ CMDIdCast::~CMDIdCast() // //--------------------------------------------------------------------------- void -CMDIdCast::Serialize() +CMDIdCast::Serialize() const { + if (m_str.Length() > 0) + { + return; + } + + m_str.Reset(); // serialize mdid as SystemType.mdidSrc.mdidDest m_str.AppendFormat(GPOS_WSZ_LIT("%d.%d.%d.%d;%d.%d.%d"), MdidType(), m_mdid_src->Oid(), m_mdid_src->VersionMajor(), @@ -81,6 +84,7 @@ CMDIdCast::Serialize() const WCHAR * CMDIdCast::GetBuffer() const { + Serialize(); return m_str.GetBuffer(); } @@ -146,6 +150,7 @@ void CMDIdCast::Serialize(CXMLSerializer *xml_serializer, const CWStringConst *pstrAttribute) const { + Serialize(); xml_serializer->AddAttribute(pstrAttribute, &m_str); } @@ -160,7 +165,7 @@ CMDIdCast::Serialize(CXMLSerializer *xml_serializer, IOstream & CMDIdCast::OsPrint(IOstream &os) const { - os << "(" << m_str.GetBuffer() << ")"; + os << "(" << GetBuffer() << ")"; return os; } diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdColStats.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdColStats.cpp index 26dd277bf3..13a3f2c141 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdColStats.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdColStats.cpp @@ -31,9 +31,6 @@ CMDIdColStats::CMDIdColStats(CMDIdGPDB *rel_mdid, ULONG pos) m_str(m_mdid_buffer, GPOS_ARRAY_SIZE(m_mdid_buffer)) { GPOS_ASSERT(rel_mdid->IsValid()); - - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -58,8 +55,14 @@ CMDIdColStats::~CMDIdColStats() // //--------------------------------------------------------------------------- void -CMDIdColStats::Serialize() +CMDIdColStats::Serialize() const { + if (m_str.Length() > 0) + { + return; + } + + m_str.Reset(); // serialize mdid as SystemType.Oid.Major.Minor.Attno m_str.AppendFormat(GPOS_WSZ_LIT("%d.%d.%d.%d.%d"), MdidType(), m_rel_mdid->Oid(), m_rel_mdid->VersionMajor(), @@ -77,6 +80,7 @@ CMDIdColStats::Serialize() const WCHAR * CMDIdColStats::GetBuffer() const { + Serialize(); return m_str.GetBuffer(); } @@ -142,6 +146,7 @@ void CMDIdColStats::Serialize(CXMLSerializer *xml_serializer, const CWStringConst *attribute_str) const { + Serialize(); xml_serializer->AddAttribute(attribute_str, &m_str); } @@ -156,7 +161,7 @@ CMDIdColStats::Serialize(CXMLSerializer *xml_serializer, IOstream & CMDIdColStats::OsPrint(IOstream &os) const { - os << "(" << m_str.GetBuffer() << ")"; + os << "(" << GetBuffer() << ")"; return os; } diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdGPDB.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdGPDB.cpp index a8c98b058d..311184f2e2 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdGPDB.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdGPDB.cpp @@ -133,9 +133,6 @@ CMDIdGPDB::CMDIdGPDB(CSystemId sysid, OID oid) // construct an invalid mdid 0.0.0 m_major_version = 0; } - - // serialize mdid into static string - Serialize(); } CMDIdGPDB::CMDIdGPDB(EMDIdType mdIdType, OID oid, ULONG version_major, @@ -154,8 +151,6 @@ CMDIdGPDB::CMDIdGPDB(EMDIdType mdIdType, OID oid, ULONG version_major, // construct an invalid mdid 0.0.0 m_major_version = 0; } - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -174,8 +169,6 @@ CMDIdGPDB::CMDIdGPDB(const CMDIdGPDB &mdid_source) m_minor_version(mdid_source.VersionMinor()), m_str(m_mdid_array, GPOS_ARRAY_SIZE(m_mdid_array)) { - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -187,8 +180,13 @@ CMDIdGPDB::CMDIdGPDB(const CMDIdGPDB &mdid_source) // //--------------------------------------------------------------------------- void -CMDIdGPDB::Serialize() +CMDIdGPDB::Serialize() const { + if (m_str.Length() > 0) + { + return; + } + m_str.Reset(); // serialize mdid as SystemType.Oid.Major.Minor m_str.AppendFormat(GPOS_WSZ_LIT("%d.%d.%d.%d"), MdidType(), m_oid, @@ -206,6 +204,7 @@ CMDIdGPDB::Serialize() const WCHAR * CMDIdGPDB::GetBuffer() const { + Serialize(); return m_str.GetBuffer(); } @@ -220,6 +219,7 @@ CMDIdGPDB::GetBuffer() const OID CMDIdGPDB::Oid() const { + Serialize(); return m_oid; } @@ -307,6 +307,7 @@ void CMDIdGPDB::Serialize(CXMLSerializer *xml_serializer, const CWStringConst *attribute_str) const { + Serialize(); xml_serializer->AddAttribute(attribute_str, &m_str); } @@ -321,7 +322,7 @@ CMDIdGPDB::Serialize(CXMLSerializer *xml_serializer, IOstream & CMDIdGPDB::OsPrint(IOstream &os) const { - os << "(" << m_str.GetBuffer() << ")"; + os << "(" << GetBuffer() << ")"; return os; } diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdGPDBCtas.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdGPDBCtas.cpp index 637bc31bc7..900a4c50c2 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdGPDBCtas.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdGPDBCtas.cpp @@ -32,7 +32,6 @@ CMDIdGPDBCtas CMDIdGPDBCtas::m_mdid_invalid_key(0); CMDIdGPDBCtas::CMDIdGPDBCtas(OID oid) : CMDIdGPDB(CSystemId(IMDId::EmdidGeneral, GPMD_GPDB_CTAS_SYSID), oid) { - Serialize(); } @@ -49,7 +48,6 @@ CMDIdGPDBCtas::CMDIdGPDBCtas(const CMDIdGPDBCtas &mdid_source) { GPOS_ASSERT(mdid_source.IsValid()); GPOS_ASSERT(IMDId::EmdidGPDBCtas == mdid_source.MdidType()); - Serialize(); } //--------------------------------------------------------------------------- diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdRelStats.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdRelStats.cpp index 17a28f2238..42b3aa927b 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdRelStats.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdRelStats.cpp @@ -28,8 +28,6 @@ using namespace gpmd; CMDIdRelStats::CMDIdRelStats(CMDIdGPDB *rel_mdid) : m_rel_mdid(rel_mdid), m_str(m_mdid_array, GPOS_ARRAY_SIZE(m_mdid_array)) { - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -54,8 +52,14 @@ CMDIdRelStats::~CMDIdRelStats() // //--------------------------------------------------------------------------- void -CMDIdRelStats::Serialize() +CMDIdRelStats::Serialize() const { + if (m_str.Length() > 0) + { + return; + } + + m_str.Reset(); // serialize mdid as SystemType.Oid.Major.Minor m_str.AppendFormat(GPOS_WSZ_LIT("%d.%d.%d.%d"), MdidType(), m_rel_mdid->Oid(), m_rel_mdid->VersionMajor(), @@ -73,6 +77,7 @@ CMDIdRelStats::Serialize() const WCHAR * CMDIdRelStats::GetBuffer() const { + Serialize(); return m_str.GetBuffer(); } @@ -123,6 +128,7 @@ void CMDIdRelStats::Serialize(CXMLSerializer *xml_serializer, const CWStringConst *attribute_str) const { + Serialize(); xml_serializer->AddAttribute(attribute_str, &m_str); } @@ -137,7 +143,7 @@ CMDIdRelStats::Serialize(CXMLSerializer *xml_serializer, IOstream & CMDIdRelStats::OsPrint(IOstream &os) const { - os << "(" << m_str.GetBuffer() << ")"; + os << "(" << GetBuffer() << ")"; return os; } diff --git a/src/backend/gporca/libnaucrates/src/md/CMDIdScCmp.cpp b/src/backend/gporca/libnaucrates/src/md/CMDIdScCmp.cpp index 5f8cae41db..bf9f7fb2cc 100644 --- a/src/backend/gporca/libnaucrates/src/md/CMDIdScCmp.cpp +++ b/src/backend/gporca/libnaucrates/src/md/CMDIdScCmp.cpp @@ -36,9 +36,6 @@ CMDIdScCmp::CMDIdScCmp(CMDIdGPDB *left_mdid, CMDIdGPDB *right_mdid, GPOS_ASSERT(IMDType::EcmptOther != cmp_type); GPOS_ASSERT(left_mdid->Sysid().Equals(right_mdid->Sysid())); - - // serialize mdid into static string - Serialize(); } //--------------------------------------------------------------------------- @@ -64,8 +61,13 @@ CMDIdScCmp::~CMDIdScCmp() // //--------------------------------------------------------------------------- void -CMDIdScCmp::Serialize() +CMDIdScCmp::Serialize() const { + if (m_str.Length() > 0) + { + return; + } + // serialize mdid as SystemType.mdidLeft;mdidRight;CmpType m_str.AppendFormat(GPOS_WSZ_LIT("%d.%d.%d.%d;%d.%d.%d;%d"), MdidType(), m_mdid_left->Oid(), m_mdid_left->VersionMajor(), @@ -167,6 +169,7 @@ void CMDIdScCmp::Serialize(CXMLSerializer *xml_serializer, const CWStringConst *attribute_str) const { + Serialize(); xml_serializer->AddAttribute(attribute_str, &m_str); } @@ -181,7 +184,7 @@ CMDIdScCmp::Serialize(CXMLSerializer *xml_serializer, IOstream & CMDIdScCmp::OsPrint(IOstream &os) const { - os << "(" << m_str.GetBuffer() << ")"; + os << "(" << GetBuffer() << ")"; return os; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
