由于多版本的需求,内存中会缓存多个版本的 schema,其内存的需求与总的 schema数量成正比。为控制内存使用的总量,会根据访问热度来决定缓存哪些 Schema 信息。例如,对于100万张表,实际上可能只有2万张表是被经常访问,这些经常访问的表会被缓存在内存里。如果访问的表模式恰好不在内存中,会从系统表中获取信息构造Schema。

    在缓存的实现上分为 schema meta 和 schema 两层。Schema meta 包含更精简的信息,对表来说,只有表名、id和版本信息,不包含列信息。所有系统对象的 Schema meta 信息都保存在缓存中;schema 层则包含系统对象的完整信息,对表来说,包含了所有列的信息。两部分用不同的内存管理方式。meta 部分通过 round-robin 的方式管理两个内存分配器,每个分配器采用多次分配,一次性释放的方式,避免内存碎片问题。而 schema 部分使用的是系统的KV Cache 机制,由 KV Cache 模块来负责内存管理和缓存的替换淘汰策略。